2013-03-20 140 views
0

我需要提交代码以在执行消息抽取的线程中运行,而不是定义了几个自定义消息。
有点像Java的SwingUtilities.invokeLater()(注:我已经有一个工具,它允许一个lambda是callbackable)在UI线程上运行代码

我已经尝试::SendMessageCallback & SendAsyncProc,但回调是由同一个发件人线程调用时调用::GetMessage(即api的要求...)
自动柜员机我的选择是定义一个自定义消息(即WM_USER_EXECUTE),通过回调,但这需要所有的目标准备接收该消息! 我宁愿采用更通用的方式。

+1

QueueUserAPC()? – 2013-03-20 11:42:47

+0

@开始我正在调查,谢谢你的一刻,我不知道api – MrAduer 2013-03-20 11:51:38

+0

@Martin Argh!它没有工作。在APC排队后,没有任何事情发生,直到接收器线程进入可改变的状态(例如通过调用SleepEx以bAlertable TRUE) 显然,:: GetMessage的内部不会使线程处于这种状态:( – MrAduer 2013-03-20 12:20:00

回答

0

最后我找到了一种方式来获得我所需要的,所以我离开我为别人解决方案。

  1. 获取与RegisterWindowMessage()安全的消息ID(也许偏执,但机制是完全trasparent为目标..)
  2. 得到其HWND目标窗口与GetWindowThreadProcessId
  3. 线程ID安装与::SetWindowsHookEx挂钩参数WH_CALLWNDPROC
  4. 在hook例程中忽略除我们特殊的那些之外的所有消息。
    当味精被发现,运行携带其中wParam
  5. 触发了整个事情与SendMessage经过特殊味精id和常规的包含要执行的代码指针回调

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

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

相关问题