Warum blockiert ProcessCmdKey in VB.NET 2003 die Shortcuts von MainMenu1?

Antwort vom

**`ProcessCmdKey` behindert die Shortcuts von `MainMenu1`, weil diese Methode Tastenkombinationen früher im Nachrichtenweg abfängt als das `MainMenu` – und sobald du dort ein `True` zurückgibst oder `MyBase.ProcessCmdKey(...)` nicht korrekt weiterleitest, bekommt das Menü die Taste gar nicht mehr.** ([syncfusion.com](https://www.syncfusion.com/faq/windowsforms/menus/how-do-menu-shortcuts-work)) ## Warum das passiert In WinForms läuft die Tastaturverarbeitung grob so: fokussiertes Control → übergeordnete Controls/Form → erst dort kann auch das `MainMenu` seine Shortcut-Tasten prüfen. `ProcessCmdKey` ist genau für diese Vorab-Verarbeitung gedacht. Wenn du sie überschreibst, sitzt du also vor dem Menü in der Kette. ([syncfusion.com](https://www.syncfusion.com/faq/windowsforms/menus/how-do-menu-shortcuts-work)) Der entscheidende Punkt ist: Wenn deine Überschreibung eine Taste „verbraucht“, ist die Verarbeitung beendet. Dann werden `MainMenu1`-Shortcuts wie `Ctrl+S` oder `F5` nicht mehr ausgelöst, obwohl sie im Menü korrekt eingetragen sind. Das ist kein spezieller Fehler von `MainMenu1`, sondern die normale Priorität von `ProcessCmdKey`. ([syncfusion.com](https://www.syncfusion.com/faq/windowsforms/menus/how-do-menu-shortcuts-work)) ## Der typische Fehler in VB.NET 2003 Meist sieht das Problem so aus: ```vb Protected Overrides Function ProcessCmdKey( _ ByRef msg As Message, _ ByVal keyData As Keys) As Boolean If keyData = (Keys.Control Or Keys.S) Then MachEtwas() Return True End If Return True End Function ``` Das letzte `Return True` blockiert praktisch **alle** übrigen Tasten – also auch die Menü-Shortcuts. Richtig ist: ```vb Protected Overrides Function ProcessCmdKey( _ ByRef msg As Message, _ ByVal keyData As Keys) As Boolean If keyData = (Keys.Control Or Keys.S) Then MachEtwas() Return True End If Return MyBase.ProcessCmdKey(msg, keyData) End Function ``` So verarbeitest du nur deine eigenen Sonderfälle, und alles andere geht an die normale WinForms-/Menülogik weiter. Dass genau dieses Weiterreichen entscheidend ist, wird auch in Praxisbeispielen zu nicht mehr funktionierenden Menü-Shortcuts beschrieben. ([stackoverflow.com](https://stackoverflow.com/questions/32112942/toolstripmenuitem-shortcutkeys-not-working-unless-menu-has-focus)) ## Wichtiger Unterschied, der oft verwechselt wird `&Datei` oder `&Bearbeiten` sind **Mnemonics** für `Alt+D`, `Alt+B` usw. Die Eigenschaft `Shortcut` eines `MenuItem` ist dagegen ein echter **Shortcut** wie `Ctrl+O` oder `F2`. `ProcessCmdKey` kann beides stören, aber besonders auffällig ist es bei echten Shortcuts, weil diese normalerweise global innerhalb des Formulars funktionieren sollen. ([syncfusion.com](https://www.syncfusion.com/faq/windowsforms/menus/how-do-menu-shortcuts-work)) ## Praktische Konsequenz Wenn du in VB.NET 2003 eigene Tastenkombinationen brauchst, dann gilt: - nur die Tasten selbst behandeln, die du wirklich abfangen willst - in allen anderen Fällen immer an `MyBase.ProcessCmdKey` weitergeben - keine allgemeinen `Return True`- oder „alles selbst behandeln“-Logik einbauen Die klare Empfehlung ist deshalb: **`ProcessCmdKey` nur als Ausnahme benutzen, nicht als zentrale Shortcut-Verwaltung.** Für Standardbefehle ist das `MainMenu1` mit seiner `Shortcut`-Eigenschaft die sauberere Lösung. ([syncfusion.com](https://www.syncfusion.com/faq/windowsforms/menus/how-do-menu-shortcuts-work))