2010-11-23 12 views
2

Ich habe ein WinForms-Formular, das eine eigenständige Anwendung war, aber jetzt als Teil einer größeren WPF-App gestartet wird. Es ist immer noch ein separates Fenster, das nicht in einem WPF-Fenster enthalten ist. Das Problem, das ich sehe, ist, dass das ProcessCmdKey-Ereignis in dem Fenster nie mehr ausgelöst wird, so dass ich Probleme habe, spezielle Befehlsschlüssel zu behandeln. Dies funktionierte früher gut und der Shortcut-Handling-Code ist unverändert von früher.ProcessCmdKey feuert nie in WinForms Fenster gestartet von WPF App

Die Ursache des Problems scheint zu sein, dass das Formular nicht mehr von der WinForms Application.Run-Methode übernommen wird und daher keine eigene Nachrichtenschleife mehr aufweist. Gibt es eine Möglichkeit, dies zu beheben, während die WPF- und WinForms-Fenster weiterhin einen UI-Thread freigeben, oder muss ich einen separaten Thread für das WinForms-Fenster einrichten, damit dies funktioniert? Ich möchte es, wenn möglich, vermeiden, da ich dann die cross-thread Kommunikation für all die Dinge einrichten muss, die jetzt durch einfache Methodenaufrufe erledigt werden.

Antwort

4

Ihre Schätzung ist genau, ProcessCmdKey() wird direkt aus der Winforms-Meldungsschleife aufgerufen, wie von Application.Run() gestartet. Sie führen jetzt die WPF-Nachrichtenschleife aus, es weiß nichts über das Winforms-Tastaturhandling. Tabbing sollte auch dysfunktional sein.

Es gibt keine saubere Lösung dafür, die Objektmodelle sind zu unterschiedlich. System.Windows.Forms.Integration bietet Interop zwischen den beiden, aber das funktioniert auf der Steuerungsebene, nicht auf der Fensterebene. Form.ShowDialog() ist eine mögliche Problemumgehung.

Und ja, Sie können einen neuen STA-Thread (Thread.SetApartmentState) starten und Application.Run() aufrufen, um eine Winforms-Nachrichtenschleife zu starten. Ein unangenehmes Problem dabei ist jedoch, dass diese Formulare keine Z-Ordnungsbeziehung mit den WPF-Fenstern haben. Sie werden leicht hinter dem Fenster einer anderen App verschwinden. Bei der Behebung dieses Problems muss SetParent() pinvokiert werden. Die Eigenschaft Owner löst eine Ausnahme aus.

+0

Ich sehe, danke für die Info. Die Z-Reihenfolge wäre in diesem speziellen Fall eigentlich kein Problem, da die Fenster auf separaten Monitoren im Vollbildmodus laufen sollen. Anstelle einer sauberen Lösung habe ich jetzt eine dreckige Lösung angewendet. Ich habe die wenigen Schlüssel registriert, die ich als globale Hotkeys brauchte (mit RegisterHotKey in user32.dll), und nur auf sie reagieren, wenn das Winforms-Fenster den Fokus hat. Das scheint jetzt in Ordnung zu sein, ich werde das Fenster in WPF wahrscheinlich zu einem späteren Zeitpunkt neu schreiben. –

Verwandte Themen