使用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总是回复“不”,因为一切都是可能的…)