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

HWND是否与线程绑定(bind)?

尝试下面的人为的例子,我从来没有看到GetMessage()火。

HWND g_hWnd;

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

}

完整的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)
{
...
}

}

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

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

最佳答案

不。

GetMessage在当前线程的输入队列上返回消息。 HWND参数是一个筛选器,因此GetMessage仅在打算用于该窗口的当前线程的输入队列中返回消息。

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

关于c++ - 可以从另一个线程获取来自CreateWindow/CreateDialog的HWND吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/617248/

10-09 21:03