2009-03-06 59 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

相关问题