来自CreateWindow / CreateDialog的HWND可以从另一个线程获取消息吗?

使用Win32 API,是否可以在一个线程中创build一个窗口或对话框,然后从另一个线程收集事件?

HWND是否与线程绑定?

尝试下面的人为的例子,我从来没有看到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);
     ...
 }

有人可以解释我所看到的吗?

没有。

GetMessage在当前线程的输入队列上返回消息。 HWND参数是一个过滤器,所以GetMessage只返回当前线程的输入队列中的消息,用于该窗口。

Windows具有线程关联 – 用于窗口的消息在创建的线程上处理,因此拥有该窗口。

从MSDN :

GetMessage函数从调用线程的消息队列中检索消息

所以不,你所描述的不是直接可能的。

在你的第一个例子中,Dialog和GetMessage是在不同的线程中。 和文件说:

GetMessage函数从调用线程的消息队列中检索消息。

第二个例子工作,因为调用线程(用于GetMessage )也拥有Dialog

使用AttachThreadInput 。

在您的示例程序完成创建窗口后。

但无论如何,在win32中,所有的线程都有自己的消息队列。

所有的消息队列都可以获得在这个线程中创建的窗口的消息。

看到:

http://msdn.microsoft.com/en-us/library/ms644928 (VS.85) .aspx (使用消息和消息队列)

http://msdn.microsoft.com/en-us/library/ms644936(VS.85).aspx(GetMessage函数)

您当然可以更改处理任何窗口消息的窗口过程。 检查SetWindowLong函数 – http://msdn.microsoft.com/en-us/library/ms633591(VS.85).aspx – 关于新的proc是什么地址空间有一些规则。 我建议使用一个DLL。 另一种方法是对窗口消息队列进行分类。

当然可以 !

只需使用远程代码注入! (很经典!)

(noobs总是回复“不”,因为一切都是可能的…)