使用Win32 API,是否可以在一个线程中创建一个Window或Dialog,然后从另一个线程中为它收集事件?
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); ... }
有人可以解释一下我所看到的吗?
答案 0 :(得分:5)
没有
GetMessage返回当前线程输入队列的消息。 HWND参数是一个过滤器,因此GetMessage只返回当前线程的那个窗口的输入队列中的消息。
Windows具有线程关联性 - 用于窗口的消息在创建的线程上处理,因此拥有该窗口。
答案 1 :(得分:2)
答案 2 :(得分:2)
在您的第一个示例中,Dialog和GetMessage位于不同的主题中。文档说:
GetMessage函数从调用线程的消息队列中检索消息。
第二个例子有效,因为调用线程(GetMessage
)也拥有Dialog
。
答案 3 :(得分:2)
答案 4 :(得分:0)
在示例程序中,在创建窗口后完成。
但是无论如何在win32中所有线程都有自己的消息队列。
所有消息队列都会获取此线程中创建的窗口的消息。
请参阅:
http://msdn.microsoft.com/en-us/library/ms644928(VS.85).aspx(使用消息和消息队列)
http://msdn.microsoft.com/en-us/library/ms644936(VS.85).aspx(GetMessage函数)
答案 5 :(得分:0)
您当然可以更改处理任何窗口消息的窗口过程。检查SetWindowLong函数 - http://msdn.microsoft.com/en-us/library/ms633591(VS.85).aspx - 关于新proc的地址空间有一些规则。我建议使用一个DLL。另一种方法是对窗口消息队列进行子类化。
答案 6 :(得分:-3)
当然可以!
只需使用远程代码注入! (很经典!)