2010-11-23 12 views
2

以前はスタンドアロンアプリケーションだったWinFormsフォームがありますが、現在はより大きなWPFアプリケーションの一部として起動しています。まだ別のウィンドウで、WPFウィンドウには含まれていません。私が見ている問題は、ウィンドウ内のProcessCmdKeyイベントがこれ以上発生しないため、特別なコマンドキーの処理に問題があることです。これは正常に動作するために使用され、ショートカット処理コードは以前のものと同じです。WPFアプリケーションから起動したWinFormsウィンドウでProcessCmdKeyが発生しない

この問題の根本的な原因は、フォームがWinForms Application.Runメソッドからインクルードされていないため、独自のメッセージループが存在しないためです。 WPFとWinFormsウィンドウでUIスレッドを共有している間にこれを修正する方法はありますか?またはこれを動作させるためにWinFormsウィンドウ用に個別のスレッドを設定する必要がありますか?できるだけ避けたいのですが、単純なメソッド呼び出しで行われているすべてのことに対してクロススレッド通信を設定する必要があります。

答えて

4

あなたの推測は正確です。ProcessCmdKey()は、Application.Run()によって開始されるWinformsメッセージループから直接呼び出されます。 WPFメッセージループを実行していますが、Winformsのキーボード処理については何も知られていません。タブは機能不全でなければなりません。

このためのクリーンフィックスはありません。オブジェクトモデルはあまりにも異なっています。 System.Windows.Forms.Integrationは2つの間のinteropを提供しますが、ウィンドウレベルではなくコントロールレベルで機能します。 Form.ShowDialog()が考えられる回避策です。

はい、新しいSTAスレッド(Thread.SetApartmentStateを使用)を起動し、Application.Run()を呼び出してWinformsメッセージループを開始することができます。ただし、これらのフォームにはWPFウィンドウとのZオーダー関係はありません。彼らは簡単に別のアプリのウィンドウの後ろに消えるでしょう。修正するには、SetParent()をピンボーキングする必要があります。Ownerプロパティは例外をスローします。

+0

ご覧いただきありがとうございます。 Zオーダーは実際にはこの特定のケースでは問題にはなりません。なぜなら、ウィンドウは別々のモニターで全画面表示されるからです。クリーンな修正の代わりに、私は今、汚い修正を適用しました。私はグローバルホットキーとして(User32.dllのRegisterHotKeyを使用して)必要ないくつかのキーを登録しており、Winformsウィンドウにフォーカスがある場合にのみそれらに作用します。それは今のところうまくいくようですが、私はおそらく後でWPFのウィンドウを書き直すでしょう。 –

関連する問題