2010-11-23 36 views
2

我有一個以前是獨立應用程序的WinForms表單,但現在正在作爲更大的WPF應用程序的一部分啓動。它仍然是一個單獨的窗口,不包含在WPF窗口中。我看到的問題是,窗口中的ProcessCmdKey事件從不再觸發,所以我在處理特殊命令鍵時遇到了問題。這用於正常工作,並且快捷方式處理代碼與之前沒有變化。ProcessCmdKey從不從WPF應用程序啓動的WinForms窗口觸發

問題的根源似乎是表單不再從WinForms Application.Run方法中被引用,因此它不再具有自己的消息循環。有沒有辦法解決這個問題,同時仍然有WPF和WinForms窗口共享一個UI線程,或者我將不得不爲WinForms窗口設置一個單獨的線程以使其工作?如果可能的話,我想避免它,因爲我必須爲所有現在通過簡單方法調用完成的事情設置跨線程通信。

回答

4

您的猜測是準確的,ProcessCmdKey()直接從Application.Run()開始的Winforms消息循環中調用。您現在正在運行WPF消息循環,它不知道有關Winforms鍵盤處理的任何信息。 Tabbing也應該失效。

有沒有乾淨的修復,對象模型太不同了。 System.Windows.Forms.Integration提供了兩者之間的互操作性,但是在控制級別工作,而不是窗口級別。 Form.ShowDialog()是一種可能的解決方法。

是的,您可以啓動一個新的STA線程(使用Thread.SetApartmentState)並調用Application.Run()來啓動Winforms消息循環。然而,令人討厭的問題是這些表單與WPF窗口沒有Z順序關係。他們很容易就會消​​失在另一個應用程序的窗口後面。修復需要禁止SetParent()Owner屬性將引發異常。

+0

我看到了,謝謝你的信息。在這種情況下,Z順序實際上不會成爲問題,因爲這些窗口是爲了在單獨的顯示器上全屏運行。代替一個乾淨的修復我現在已經應用了一個骯髒的修復。我已經註冊了我需要的幾個鍵作爲全局熱鍵(在user32.dll中使用RegisterHotKey),並且只有在Winforms窗口具有焦點時纔對它們進行操作。這似乎現在工作正常,我可能會在稍後的階段重寫WPF窗口。 – 2010-11-24 12:50:47

相關問題