0

メッセージ ポンプを使用して古い DLL と通信するために、NativeWindow サブクラス ('MyNativeWindow') を作成しています。私のコードは WinForms アプリケーション内で実行されますが、DLL とそのメッセージ処理を GUI の範囲外に保持したいと考えています。

アプリケーション コンテキストから MyNativeWindow を作成すると (アプリケーションのメイン フォームを作成する直前)、すべてが機能します。NativeWindow の WndProc が呼び出され、イベントが処理されます。ただし、スレッドを使用して MyNativeWindow を初期化すると、メッセージ ポンプが実行されないようです。

NativeWindow の作成に制限はありますか?

4

2 に答える 2

3

あなたがここで何を期待しているのかわからないので、完全にお答えできるかどうかわかりません. NativeWindow にはメッセージ ポンプがありません。ウィンドウ プロシージャを置き換えることによって、既存のウィンドウを単にサブクラス化します。スレッドのメッセージ ポンプがそのウィンドウにメッセージを配信すると、メッセージは元のウィンドウ プロシージャではなく、NativeWindow サブクラスのウィンドウ プロシージャに送られます。サブクラスがそれを処理しない場合は、元のウィンドウ プロシージャに転送する必要があります。

ウィンドウを作成してから、セカンダリ スレッドで NativeWindow サブクラスを作成していると思われますが、そのスレッドでメッセージ ポンプを作成していません。したがって、メッセージは処理されません。セカンダリ スレッドでメッセージ ポンプを作成し、単純に終了しないようにする場合は、ウィンドウを作成してから、そのスレッドで何らかの形式の Application.Run を呼び出す必要があります。その後、ウィンドウをサブクラス化し、メッセージを受け取ることができます。

于 2009-08-05T15:24:42.767 に答える
0

メッセージポンプも開始する必要があります.NativeWindowを作成しても、それはわかりません.

恥知らずなプラグイン: backgrounderを試して、次のようにします。

BackgroundHelper helper = new BackgroundHelper();
helper.Background(() => {
    MyNativeWindow receiver = new MyNativeWindow();
});

そして、それがすぐに機能するかどうかを確認してください。

(そうでない場合は、Issue Tracker で私を悩ませてください :-))

于 2009-10-14T22:46:01.847 に答える