CreateWindow / CreateDialog中的HWND可以从另一个线程获取GetMessage吗?

时间:2009-03-06 00:07:33

标签: c++ c windows multithreading winapi

使用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);
    ...
}

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

7 个答案:

答案 0 :(得分:5)

没有

GetMessage返回当前线程输入队列的消息。 HWND参数是一个过滤器,因此GetMessage只返回当前线程的那个窗口的输入队列中的消息。

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

答案 1 :(得分:2)

来自MSDN

  

GetMessage函数检索一个   来自调用线程的消息   消息队列

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

答案 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)

当然可以!

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