2017-07-21 5 views
1

Ich habe eine Windows Forms-Anwendung (.NET 4.6, VS.2017) entwickelt und ich habe zwei Formulare, das Hauptformular und ein nicht-modales Formular. In beiden Formen muss ich den Benutzer abfangen, der die F2 Taste drückt. Dies ist übrigens die einzige Funktionstaste, die von der Anwendung verwendet wird, keine andere Verknüpfung, die für eine andere Funktionstaste definiert wurde.Abfangen von Funktionstasten auf Formularebene ohne Menüelementkonflikt

In beiden Formen I aktiviert Form.KeyPreview, die standardmäßig falsch ist. Dann implementiert ich auch das Ereignis KeyDown und es prüfe ich, ob es meine Funktionstaste ist:

private void myView_KeyDown(object sender, KeyEventArgs e) 
{ 
    if (e.KeyCode == Keys.F2) // breakpoint placed here! 
    { 
     // perform action 
     e.Handled = true; 
    } 
} 

Bemerken, dass ich einen Haltepunkt auf der IF-Anweisung Prüfung gesetzt habe, welche Taste gedrückt wurde und nicht innerhalb der Aktionsblock.

Jetzt in meiner nicht-modalen Form, die absolut einwandfrei funktioniert, egal welche Funktionstaste ich wähle.

Allerdings zeigt die Hauptform ein seltsames Verhalten mit dem gleichen Code. Wenn ich in der Hauptform 'e.KeyCode == Keys.F3' verwende, dann wird der Haltepunkt für alle anderen Funktionstasten ausgelöst, außer F3.

Also habe ich dann die if-Anweisung geändert, anstatt nach F2 anstatt nach F3 zu suchen. Aber jetzt mit dieser Änderung der Breakpoint triggert für alle Funktionstasten außer F2, so F3, die vorher nicht funktionierte (wenn man nach F3 sucht), funktioniert jetzt aber F2 nicht.

Es spielt keine Rolle, welche Funktionstaste ich gewählt habe, der Haltepunkt wird für ALLE Funktionstasten ausgelöst, AUSSER die, die ich gewählt habe.

Hier ist die catch though ... In einem meiner ToolStripMenuItems habe ich auch den gleichen Function Key als Verknüpfung, weil sie die gleiche Aktion erfüllen (dann muss der Benutzer nicht Alt G und dann Alt etwas anderes aber stattdessen drücken Verwenden Sie F2 direkt

Also, wenn ich die Verknüpfung aus dem ToolStripMenuItem entfernen, funktioniert mein Formular KeyDown wie erwartet, aber es gibt keinen visuellen Hinweis für den Benutzer, dass er F2 verwenden kann, um diese Funktion zu erfüllen auch, dass weder die toolstripmenuitem noch das Formular auf die gewählte Funktionstaste reagieren

Was kann ich tun, damit die Verknüpfung sowohl für den Werkzeugleistenmenüpunkt als auch a funktioniert t Formstufe?

+0

Abgesehen davon, ob der Breakpoint getroffen wird oder nicht, was ist das Problem? Kompilierungsoptimierung kann dazu führen, was Sie beobachten, und ich würde mir keine Sorgen machen, es sei denn, es gibt ein tatsächliches Problem. –

+0

Das Problem ist, dass ich die Verknüpfung sowohl für den Tooltrip-Menüpunkt als auch für die Tasteneingabe haben möchte, da in beiden Fällen F2 eine Funktion ausführen soll. Aber es scheint, dass es nicht beide Arten behandeln kann –

+0

Warum verwenden Sie das KeyDown-Ereignis und KeyPreview? Die Einstellung der ShortCut-Tasten scheint Ihr gewünschtes Verhalten zu erreichen. –

Antwort

0

Nach dem Testen der ShortcutKeys -Eigenschaft von MenuStripITem auf 'F2' konnte ich das von Ihnen erwähnte Verhalten erhalten. Durch Klicken auf den Menüeintrag oder durch Drücken von F2 wurde der Handler-Code der Schaltfläche ausgeführt. Ich habe die KeyPreview-Eigenschaft weder geändert noch KeyDown implementiert. Ich denke, dass Sie diesen unnötigen Code loswerden können.