0

いくつかのカスタム メッセージを定義せずに、メッセージ ポンピングを行うスレッドで実行するコードを送信する必要があります。
JavaのようなものSwingUtilities.invokeLater()(注:ラムダをコールバック可能にするユーティリティがすでにあります)

私はすでに試し::SendMessageCallback & SendAsyncProcましたが、コールバックは呼び出し時に同じ送信者スレッドによって呼び出されます::GetMessage(これはその API の要件です...)

ATM 私の代替手段は、コールバックを渡すカスタム メッセージ (つまり、WM_USER_EXECUTE) を定義することです。ただし、これには、すべてのターゲットがそのメッセージを受信する準備ができている必要があります! 私はより一般的な方法を好むでしょう。

4

2 に答える 2

1

GetMessage 呼び出しを MsgWaitForMultipleObjectsEx() API への呼び出しに置き換えます。たくさんのタイピングですが、うまくいくはずです...

http://msdn.microsoft.com/en-us/library/windows/desktop/ms684245%28v=vs.85%29.aspx

于 2013-03-20T15:15:31.350 に答える
1

最後に、必要なものを取得する方法を見つけたので、解決策を他の人に任せます。

  1. 安全なメッセージ ID を取得しますRegisterWindowMessage()(偏執的かもしれませんが、メカニズムはターゲットに対して完全に透過的です..)
  2. HWND からターゲット ウィンドウのスレッド ID を取得します。GetWindowThreadProcessId
  3. ::SetWindowsHookExでパラメータ化されたフックをインストールしますWH_CALLWNDPROC
  4. フック ルーチン内では、特別なメッセージ以外のすべてのメッセージを無視します。
    その MSG が見つかったら、wParam で運ばれるコールバックを実行します。
  5. SendMessage特別な MSG ID と、実行するコードを含むルーチンのポインターを渡すことで、すべてをトリガーします。

すべてを関数にカプセル化して、invokeOnWndProc(HWND, lambda_Callback) として使用できます

。長所: コードは UI スレッドで実行され、完全に透過的で、同期動作です!
短所:かなり重い..

于 2013-03-20T18:01:50.310 に答える