Strg+Tab bei Textboxen abfangen
-
Ich habe eine TextBox auf einem Formular plaziert und möchte gerne bei Strg+Tab bzw. Strg+Shift+Tab eigene Funktionen ausführen.
Bei der TextBox ist WantTabs auf 'false' gesetzt, denn es dürfen dort keine Tabs (und auch keine Returns (WantReturn=false)) eingetragen werden.Jedoch triggert weder OnKeyPress noch OnKeyDown bei Strg+Tab.
Nur wenn ich Strg+Alt+Tab bzw. AltGr+Tab drücke, erhalte ich ein Event (jedoch sind diese Tastenkombinationen nicht so intuitiv -).Ich habe auch schon testweise WantTabs auf true gesetzt, aber das klappt dann
auch nicht. Ich habe zusätzlich noch beim Hauptformular KeyPreview auf true stehen, aber auch dort kommt dieses Events nicht an. Die TextBox scheint irgendwie die Tab-Taste zu "schlucken"...Bei anderen Steuerelementen klappt Strg+Tab einwandfrei, nur die TextBox mag mich nicht -)
Weiß jemand, wie ich irgendwie an dieses Tastenevent komme???
-
private void textBox1_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e) { if(e.Control == true && e.Alt == true && e.KeyCode == Keys.Tab) MessageBox.Show("Strg+Alt+Tab wurde gedrueckt!"); }
-
Strg-Taste kannst Du mit dem boolschen Property e.Control erfragen.
Alt-Taste kannst Du mit dem ebenfalls boolschen Property e.Alt
erfragen!Die Tab-Taste erfrage ich im Beispiel ueber die Eigenschaft KeyCode
-
so habs mal konkret getestet hab zu diesem Zweck 3 Label fuer
die Tasten STRG, ALT und TAB auf die Form gezogen und habe KeyDown als auch KeyUp fuer die textBox ueberladen!private void textBox1_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e) { if(e.Alt == true) label1.Text = "Alt := True"; else label1.Text = "Alt := false"; if(e.Control == true) label2.Text = "Strg := True"; else label2.Text = "Strg := False"; if(e.KeyCode == Keys.Tab) label3.Text = "Tab := True"; else label3.Text = "Tab := False"; } private void textBox1_KeyUp(object sender, System.Windows.Forms.KeyEventArgs e) { if(e.Alt == true) label1.Text = "Alt := True"; else label1.Text = "Alt := false"; if(e.Control == true) label2.Text = "Strg := True"; else label2.Text = "Strg := False"; if(e.KeyCode == Keys.Tab) label3.Text = "Tab := True"; else label3.Text = "Tab := False"; }
funzt!!! Mach es dochmal genauso und variere den Code dann wie Du Ihn brauchst.
-
Problem treten nur dann auf wenn Du die Eigenschaft
TabStop = true setzt auf (bedeutet kannst die Textbox durch den Tabulator fokusieren!
setzt Du diese eigenscahft auf False funktioniert mein Code mit den 3 Labels ausgezeichnet.
Es werden dann alle Kombinationen der 3 Tasten STRG, ALT und TAB angezeigt,
Voraussetztung TabStop = false (Eingabfokus des Textfeldes durch Tabulatorschaltung nicht möglich).Sprich nimm das Textfeld aus der Fokusierung durch die Tabulatordurchschaltung raus und es geht!
-
jedoch denke ich Du arbeitest bestimmt mit .NET 2.0
ich schaffe noch mit .NET 1.1
da ich Wantreturn bei mir nicht habe.
Auswirkung auf das Tabverhalten hat aber auch die Eigenscahft Multilineda ja wenn diese Eigenscaft auf true ist die TextBox mehrzeilig in Richtung Editor mutiert, gebe ich auch zu bedenken.
Also ich an deiner Stelle wuerde fuer deine Aufgabe ein eigenes Control bauen
was von der TextBox erbt! Einfach diese Ding in einem reinen Anwendungprojekt
naja!!!!Das schreit geradezu danach ein neues Control auf Basis einer TextBox selbst zu bauen. Dann kannste deine Logik die das Steuerelement braucht auch in derer
neuen Klasse implementieren. Dann bleibt der reine Code der Anwendungoberfläche von den Experimenten mit KeyDown und KeyUp verschont.Ist jetzt nur meine Meinung zu dem Thema.
-
Wie gesagt:
TabStop = true; // sollte genommen werden bei einer Einzeiligen Eingabe MultiLine = true; // sollte genommen werden TabStop = false; // wenn es darum geht Mehrzeilige Eingabe // in Richtung Texteditor geht
Beispiel NotPad-Editor dessen Textfeld kannst Du ja z.B. auch nicht durch Tabulatorreihenfolge fokusieren. Wohingegen man bei normalen Windowsanwendungen mit einfachen einzeiligen Eingabfeldern man alle Controls also auch diese Einzeiligen Eingabefelder durchschalten kann.
Man sieht also diese boolschen Eigenschaften der textbox haben auch auswirkungen auf deren ansprechverhalten bei speziellen Eingabe-Keys.
Bei den Daten die man dann in dem KeyEventargs-Parameter, den man bei den
CallBack-Methodem KeyPress als auch bei KeyUp, bekommt bieten dann unter Umständen auch keine Möglichkeit bestimmte Taste abzufragen. Da in den verschiedene Rollen die das Eingabfeld spielt entssprechenden Tasten auch andere Funktionen zukommen.Da Deine Lösung gewünschtes Verhalten sehr speziell ist würde ich sagen mach eine kleine Experimentieranwendung. Hast Du mit der dann Dein gewünschtes Verhalten einer Textbox erreicht?! Würde ich dieses in einem eigene Control was von der TextBox-Klasse erbt implementieren. In dieser neuen TextBox-Klasse kannst Du dann fuer deine gewünschten Besonderheiten auch noch eigen öffentliche
Delegaten/Events einbauen.
-
@sclearscreen:
Sorry, daß ich nicht so schnell geantwortet habe, aber gestern war ich offline.Außerdem hatte ich mich bei den Eigenschaftsnamen vertan. Hier noch mal meine Einstellungen für die TextBox:
AcceptsReturn = false
AcceptsTab = false
Multiline = true
TabStop = trueIch benutze auch noch .Net 1.1!
Wenn ich diese Einstellungen habe, dann kriege ich weder bei MainForm_KeyDown noch bei textBox_KeyDown einen Event, wenn ich die Tastenkombination Strg+Tab drücke. Da in MainForm KeyPreview = true ist, sollen erst alle Events in MainForm_KeyDown landen.
Bei normalem Tab bzw. Shift+Tab soll er ja durch die Elemente tabben (also Focus auf's nächste Element setzen).
Außerdem mußte ich bei der TextBox die Tab-Taste noch unterdrücken, da nämlich bei Drücken von Strg+Alt+Tab doch ein Tab-Zeichen in die TextBox eingefügt wurde, obwohl AcceptsTab false ist.
Hinzu kommt noch, daß ich mit der Komponente WeifenLuo (DockPanel) arbeite, aber diese scheint nicht der Grund für den Fehler zu sein, da es ja bei anderen Controls funktioniert (also wenn der Focus z.B. auf einer ComboBox ist und ich Strg+Tab drücke, dann kommt dieser Event in MainForm_KeyDown an, nur eben bei dieser verflixten TextBox nicht (grrrr)).
Vielen Dank auch noch für deine bisherige Mühe.
Evtl. muß ich doch eine eigene Komponente basteln, aber dann müßte ich die ja in eine DLL auslagern, da ich sonst die Textbox nicht im Designer zur Verfügung hätte (und das ist mir bisher zu viel Akt...)
Für einen MultiSelektion-TreeView habe ich dies schon gemacht, aber das war ja auch sinnvoll...
-
Also bei TabStop = false klappt es auch bei mir, aber ich muß unbedingt TabStop auf true setzen, da dies für den Anwender noch wichtiger ist als der Wechsel zwischen verschiedenen Fenstern mittels Strg+Tab.
Anscheinend fängt also die TextBox die Tab-Taste unabhängig vom Status der anderen Steuertasten Strg, Shift oder Alt ab!
Aber selbst wenn ich eine eigene Komponente erzeugen würde, wie kann ich TabStop auf true setzen und doch das Event Strg+Tab getrennt davon bearbeiten?
-
guckmal
der KeyEventArgs-Parameter
hat noch die eigenschaft Modifiers
folgendes schreibt die MSDN dazu
// This example demonstrates how to use the KeyDown event with the Help class to display // pop-up style help to the user of the application. The example filters for all variations // of pressing the F1 key with a modifier key by using the KeyEventArgs properties passed // to the event handling method. // When the user presses any variation of F1 that includes any keyboard modifier, the Help // class displays a pop-up window, similar to a ToolTip, near the control. If the user presses // ALT + F2, a different Help pop-up is displayed with additional information. This example assumes // that a tTextBox control, named textBox1, has been added to the form and its KeyDown // event has been contected to this event handling method. private void textBox1_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e) { // Determine whether the key entered is the F1 key. If it is, display Help. if(e.KeyCode == Keys.F1 && (e.Alt || e.Control || e.Shift)) { // Display a pop-up Help topic to assist the user. Help.ShowPopup(textBox1, "Enter your name.", new Point(textBox1.Bottom, textBox1.Right)); } else if(e.KeyCode == Keys.F2 && e.Modifiers == Keys.Alt) { // Display a pop-up Help topic to provide additional assistance to the user. Help.ShowPopup(textBox1, "Enter your first name followed by your last name. Middle name is optional.", new Point(textBox1.Top, this.textBox1.Left)); } }
unter Modifiers sind Statusflags gespeichert die auch ALT,STRG - Tasten etc. betreffen. Die benutzen das um hier wenn entsprechende Tasten gedrueckt sind
diese Flags auszuwerten um entsprechend einer gewünschten Zusatzfunktionalitätzu benutzten!
Im MSDN Beispiel tut sich ne Popuphilfe auf, anstatt des Popup koenntest Du an der stelle ja deinen speziellen Kram reinpacken. Koennte fuer Dich in Frage kommen wenn ich das jetzt so betrachte!?
-
guckmal
der KeyEventArgs-Parameter
hat noch die eigenschaft Modifiers
folgendes schreibt die MSDN dazu
// This example demonstrates how to use the KeyDown event with the Help class to display // pop-up style help to the user of the application. The example filters for all variations // of pressing the F1 key with a modifier key by using the KeyEventArgs properties passed // to the event handling method. // When the user presses any variation of F1 that includes any keyboard modifier, the Help // class displays a pop-up window, similar to a ToolTip, near the control. If the user presses // ALT + F2, a different Help pop-up is displayed with additional information. This example assumes // that a tTextBox control, named textBox1, has been added to the form and its KeyDown // event has been contected to this event handling method. private void textBox1_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e) { // Determine whether the key entered is the F1 key. If it is, display Help. if(e.KeyCode == Keys.F1 && (e.Alt || e.Control || e.Shift)) { // Display a pop-up Help topic to assist the user. Help.ShowPopup(textBox1, "Enter your name.", new Point(textBox1.Bottom, textBox1.Right)); } else if(e.KeyCode == Keys.F2 && e.Modifiers == Keys.Alt) { // Display a pop-up Help topic to provide additional assistance to the user. Help.ShowPopup(textBox1, "Enter your first name followed by your last name. Middle name is optional.", new Point(textBox1.Top, this.textBox1.Left)); } }
unter Modifiers sind Statusflags gespeichert die auch ALT,STRG - Tasten etc. betreffen. Die benutzen das um hier wenn entsprechende Tasten gedrueckt sind
diese Flags auszuwerten um entsprechend einer gewünschten Zusatzfunktionalitätzu benutzten!
Im MSDN Beispiel tut sich ne Popuphilfe auf, anstatt des Popup koenntest Du an der stelle ja deinen speziellen Kram reinpacken. Koennte fuer Dich in Frage kommen wenn ich das jetzt so betrachte!?
-
Danke für den Tipp. Leider wurde ja die KeyDown Methode nicht angesprungen, aber du hast mich auf eine Idee gebracht.
Nun habe ich es nach viel Ausprobieren gelöst:
protected override bool ProcessCmdKey(ref Message msg, Keys keyData) { // Text = msg.ToString() + " --- " + keyData.ToString(); if((keyData & Keys.Control) > 0) if((keyData & Keys.Tab) == Keys.Tab) { bool bShift = (keyData & Keys.Shift) > 0; SelectNextStringEditor(!bShift); return true; } return base.ProcessCmdKey(ref msg, keyData); }
Ich habe einfach im Hauptformular den Tastendruck (Strg+Tab) abgefangen.
Danke nochmals für deine Mühe und vielleicht nützt dies ja auch anderen Usern...