2013-03-20 151 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線程中運行,完全透明,同步行爲!
缺點:相當重量級..