Grundsätzlich habe ich ein Formular mit einem benutzerdefinierten Steuerelement (und nichts anderes). Das benutzerdefinierte Steuerelement ist vollständig leer und das Formular hat KeyPreview auf True festgelegt.Pfeil Schlüsselereignisse nicht ankommen
Mit diesem Setup erhalte ich keine KeyDown-Ereignisse für irgendwelche Pfeiltasten oder Tab. Jede andere Taste, die ich auf meiner Tastatur habe, funktioniert. Ich habe KeyDown Event Handler an alles angeschlossen, was solche Ereignisse hat, also bin ich sicher, dass ich nichts vermisse.
Auch ist von Bedeutung, wenn ich das (völlig leere) benutzerdefinierte Steuerelement entfernen, bekomme ich die Pfeiltaste Ereignisse.
Was um alles in der Welt geht hier vor?
EDIT:
Ich habe diese sowohl für die Form und die Kontrolle, aber ich bin noch nicht Pfeiltasten bekommen:
protected override void WndProc(ref Message m) {
switch (m.Msg) {
case 0x100: //WM_KEYDOWN
//this is the control's version. In the form, it's this.Text
ParentForm.Text = ((Keys)m.WParam).ToString();
break;
}
base.WndProc(ref m);
}
ich auch mit Spy ++ überprüft und festgestellt, dass die Form selbst Es werden keine WM_KEYDOWN-Nachrichten empfangen, sie gehen alle zum Steuerelement. Wie dem auch sei, das Steuerelement erhält die Pfeiltaste WM_KEYDOWN Nachrichten. Seufzer.
Edit 2: Ich habe auch die ZIP-Datei mit dieser Version aktualisiert. Bitte schauen Sie es, wenn Sie helfen möchten, ...
bearbeiten 3:
ich dies herausgefunden haben, irgendwie. Das Formular isst die Pfeiltasten, wahrscheinlich in einem Versuch, Fokus unter seinen Kindern zu behalten. Dies wird durch die Tatsache bewiesen, dass ich die Ereignisse bekomme, wenn das Formular leer ist.
Wie auch immer, wenn ich diesen Code zum Formular hinzufügen, fange ich wieder die Ereignisse bekommen:
public override bool PreProcessMessage(ref Message msg) {
switch (msg.Msg) {
case 0x100: //WM_KEYDOWN
return false;
}
return base.PreProcessMessage(ref msg);
}
Wenn ich dies außer Kraft setzen, wird das Formular nicht die Chance bekommen ihre schmutzige Arbeit zu tun, und so Ich bekomme meine KeyDown-Ereignisse wie erwartet. Ich nehme an, dass ein Nebeneffekt davon ist, dass ich nicht mehr meine Tastatur verwenden kann, um das Formular zu navigieren (keine große Sache in diesem Fall, da es ein Spiel ist, und der ganze Zweck dieser Übung ist, Tastaturnavigation zu implementieren!)
Die Frage bleibt immer noch darüber, wie diese „richtig“ zu deaktivieren, wenn es einen Weg gibt ...
Es hört sich an, als ob das Formular, in dem sich Ihr Benutzersteuerelement befindet, das Ereignis erfasst und es so konfiguriert, dass es behandelt wird, bevor Ihr Benutzersteuerelement es empfängt. Stellen Sie sicher, dass Ihr Benutzersteuerelement beim Drücken der Taste den Fokus hat? –