2009-03-06 19 views
3

使用Win32 API,是否可以在一個線程中創建一個窗口或對話框,然後從另一個線程爲它收集事件?CreateWindow/CreateDialog的HWND可以從另一個線程獲取消息嗎?

HWNDs是否與線程綁定?

嘗試下面的人爲的例子,我從來沒有看到GetMessage()的火。

 
HWND g_hWnd; 

DWORD WINAPI myThreadProc(LPVOID lpParam) 
{ 
    while(GetMessage(&msg, hWnd, 0, 0) > 0) 
    { 
     ... 
    } 

} 

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) 
{ 
    hWnd = CreateDialog(hInstance, MAKEINTRESOURCE(IDD_MYDIALOG), 0, myDlgProc); 
    CreateThread(NULL, 0 myThreadProc, NULL, 0, NULL); 
    ... 
} 

但是我在這裏。

 
HWND g_hWnd; 
HINSTANCE g_hInstance; 

DWORD WINAPI myThreadProc(LPVOID lpParam) 
{ 
    hWnd = CreateDialog(hInstance, MAKEINTRESOURCE(IDD_MYDIALOG), 0, myDlgProc); 

    while(GetMessage(&msg, hWnd, 0, 0) > 0) 
    { 
     ... 
    } 

} 

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) 
{ 
    g_hInstance = hInstance; 
    CreateThread(NULL, 0 myThreadProc, NULL, 0, NULL); 
    ... 
} 

有人可以解釋我所看到的嗎?

回答

5

編號

GetMessage在當前線程的輸入隊列中返回消息。 HWND參數是一個過濾器,所以GetMessage只返回當前線程輸入隊列中用於該窗口的消息。

Windows具有線程關聯 - 用於窗口的消息在創建的線程上處理,因此擁有該窗口。

2

MSDN

該GetMessage函數檢索從調用線程的 消息隊列

一個 消息所以,不,你的描述是不能直接。

2

在第一個示例中,對話框和GetMessage位於不同的線程中。並且文檔說:

GetMessage函數從調用線程的消息隊列中檢索消息。

第二個例子,因爲調用線程(用於GetMessage)的作品還擁有Dialog

-3

當然你可以!

只需使用遠程代碼注入! (很經典!)

(菜鳥總是回答 「沒有」,因爲一切總是可能的...)

+1

哈!如果你將「可能」定義爲「通過完全做某件事」,那麼是的,一切皆有可能。 – Shog9 2009-12-26 19:28:57

1
+0

在Windows CE/Mobile上不可能。 – 2009-03-09 09:42:34

相關問題