0

我需要提交代码以在执行消息泵送的线程中运行,而无需定义多个自定义消息。
像 Java 之类的东西SwingUtilities.invokeLater()(注意:我已经有一个允许 lambda 可回调的实用程序)

我已经尝试过::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 获取目标窗口的线程 idGetWindowThreadProcessId
  3. 安装一个带有::SetWindowsHookEx参数化的钩子WH_CALLWNDPROC
  4. 在钩子例程中忽略除我们的特殊消息之外的所有消息。
    找到该 MSG 后,运行 wParam 携带的回调
  5. SendMessage通过传递特殊的 MSG id 和包含要执行的代码的例程的指针来触发整个事情

一切都可以封装在一个函数中并用作 invokeOnWndProc(HWND, lambda_Callback)

优点:代码在 UI 线程中运行,完全透明,同步行为!
缺点:相当重量级..

于 2013-03-20T18:01:50.310 回答