Hallo,
ich bearbeite auf auf Arbeit ein Projekt wo eine kuriosität in der Form vorkommt.
die Form ist im Windows Explorer eingebunden.
Wenn ich in eine Textbox ein u eingebe, springt der Cursor in die nächste Textbox.
Wenn ich ein Tab drücke springt er 2 Textboxen weiter.
Der Kollege der das Programmiert hat ist leider nicht mehr greifbar, und ich kann mir nicht erklären wo dies eingestellt sein soll.
MfG
Ingo
Hallo ibaxx,
naja, aber du hast doch den Code. Da solltest du schnell sehen, welche Tasten wie behandelt werden. Erste Kandidaten wären KeyUp/Press/Down. Aber sowas kann natürlich auch woanders stehen, z.B. in der WndProc.
herbivore
Hallo herbivore,
leider find ich nichts im Code, auch ein Kollege hat schon drüber geschaut.
Wo find ich denn die WncProc?
MfG
Ingo
WndProc, protected, virtual
in jedem Control.
> Codejunky <
Hallo ibaxx,
naja, geben tut es die schon in jedem Control. Wird ja von Control geerbt. Aber überschrieben muss sie natürlich nicht zwangsläufig sein. Wenn sie also im Code nicht auftaucht, dann passiert da drin auch nichts, was das beschriebene Verhalten erklären würde. Was ich genannt habe, waren ja auch nur Beispiele. Da das beschriebene Verhalten nicht Standard ist, ist die Wahrscheinlichkeit nahe 100%, dass im Code was zu finden ist. Baller im Zweifel mal alles mit Breakpoints voll und drücke dann die U-Taste.
herbivore
Hallo nochmal,
Breakpoints kann ich leider nicht setzen, da es eine Explorer Extension ist und nicht gedebuggt werden kann.
ich habe alles nach "key" durchsucht, aber auch nichts interessantes gefunden.
MfG
Ingo
Es muss ja theoretisch kein Key-Event sein, es könnte sich auch um ein TextBox Event handeln (auch wenn ich keinerlei Gründe wüsste wieso man sowas machen sollte).
Hast du dir mal alle Events angeschaut dies so gibt in dem Programm ?
also die Textboxen, haben bis auf eine alle keine Events...
das einzige was ich mit einem key-Ereignis finde ist folgendes:
if ((e.KeyState & KeyStates.CtrlKeyDown) != 0 && (e.KeyState & KeyStates.ShiftKeyDown) != 0)
e.Effect = DragDropEffects.Link;
else if ((e.KeyState & KeyStates.ShiftKeyDown) != 0)
e.Effect = DragDropEffects.Move;
else
e.Effect = DragDropEffects.Copy;
wobei hier ja ersichtlich ist, das kein u oder tab ausgewertet wird.
zudem ist dies in einer Funktion, die nichts mit der GUI zu tun hat
Guck mal in der Form bei KeyDown/Up/Press. Wenn diese Nämlich KeyPreview=true gesetzt hat, behandelt diese alle TastaturEvents zuerst.
Gruß, Christian.
Wenn diese Nämlich KeyPreview=true gesetzt hat, ...
nichts gesetzt... aber danke für den tipp
Erstell dir eine eigene TextBox-Klasse, die von System.Windows.Forms.TextBox erbt und überschreibe =>
protected override void WndProc(ref Message m)
{
// Auf WM für key up prüfen
if (m.Msg == <Windows-Message Code>) // Auflistung unter pinvoke.com, Stichwort: WM, Windows Messages
{
}
}
Damit übersteuerst du die ganzen Events usw.
Siehe auch, ProcessCmdKey, ProcessX... auf System.Windows.Forms.Control.
> Codejunky <
So nun erben lassen:
class TextBoxNew : System.Windows.Forms.TextBox
{
protected override void WndProc(ref Message m)
{
// Auf WM für key up prüfen
//if (m.Msg == <Windows-Message Code>) // Auflistung unter pinvoke.com, Stichwort: WM, Windows Messages
//{
MessageBox.Show(m.Msg.ToString());
//}
}
}
Wie bette ich diese jetzt in die Form ein?
oder wie sage ich den Textboxen, dass diese jetzt von der Klasse sind?
MfG
Ingo
so jetzt hab ichs hinbekommen, nur dass der designer folgende Fehler meldet:
Fehlermeldung:
Error creating window handle.Instances of this error (7)
- Hide Call Stack
at System.Windows.Forms.NativeWindow.CreateHandle(CreateParams cp)
at System.Windows.Forms.Control.CreateHandle()
at System.Windows.Forms.ComboBox.CreateHandle()
at System.Windows.Forms.Control.CreateControl(Boolean fIgnoreVisible)
at System.Windows.Forms.Control.CreateControl()
at System.Windows.Forms.Control.ControlCollection.Add(Control value)
at System.Windows.Forms.Design.ControlDesigner.DesignerControlCollection.Add(Control c)
- Show Call Stack
at System.Windows.Forms.NativeWindow.CreateHandle(CreateParams cp)
at System.Windows.Forms.Control.CreateHandle()
at System.Windows.Forms.ComboBox.CreateHandle()
at System.Windows.Forms.Control.CreateControl(Boolean fIgnoreVisible)
at System.Windows.Forms.Control.CreateControl()
at System.Windows.Forms.Control.ControlCollection.Add(Control value)
at System.Windows.Forms.Design.ControlDesigner.DesignerControlCollection.Add(Control c)
Ich sehe auch die Form nicht mehr
Eigentlich war herbivores 1. Stichwort zu WndProc für dich Anlass genug, danach zu googlen, Implementierungen anzuschauen, usw.
Meinem Beispiel fehlt noch der base-Aufruf zu dieser Methode. Das wäre in diesem Fal:
base.WndProc(ref m);
Für gewöhnlich am Anfang der Methode.
> Codejunky <
Hallo!
@ibaxx:
Nimm' bloss schnell MessageBox.Show wieder raus: Je nachdem was deine Anwendung macht, kriegst du pro Sekunde bis zu einem Dutzend nachrichten, die dir den Bildschirm mit MessageBoxen vollhauen. Schreib die Daten lieber in die Debug-Konsole oder eine Textdatei.
Und der Fehler könnte auftreten, weil die ersten nachrichten angezeigt werden sollen, obwohl das handle des Hauptfensters noch nicht erstellt wurde.
Evtl. wird auch ein Event oder die KeyPreview-property nicht direkt in der Hauptform sondern im Designer-Code oder durch eine andere Komponente/Klasse gesetzt, vielleicht gibt es da noch Abhängigkeiten oder Erweiterungen.
Nobody is perfect. I'm sad, i'm not nobody 🙁
hast du schon eine volltextsuche übers ganze projekt gemacht, nach Key (Großschreibung beachten, nicht nur das ganze Wort suchen)?
Der frühe Apfel fängt den Wurm.
Das mit der Tab-Taste und 2 Controls weiter springen kann ja ganz einfach am TabIndex der Controls liegen. Das mit der u-Taste kann ich mir noch nicht erklären. 😃
MfG
wax