问题 win32应用程序是否有一个消息循环?或者每个窗口是一个消息循环?


我对win32编程中的消息循环如何工作有点困惑。在我的 WinMain 我总是提出以下内容:

while ( GetMessage ( &msg, NULL, 0, 0 ) > 0 )
{
    TranslateMessage ( &msg );
    DispatchMessage ( &msg );
}

这是一个while循环,几乎运行直到你的应用程序停止。这是否意味着每个应用程序而不是每个窗口都有一个消息循环?


12156
2017-08-07 18:51


起源

每个线程一个。 - lapk
每个线程需要一个。您可以使用该线程驱动任意数量的窗口。 - chris
得到它了。多谢你们! - bodacydo
每个线程最多有一个消息队列。通常,您只为每个消息队列设置一个消息循环。对话框使用嵌套的消息循环,这些消息循环对于客户端来说大部分是不可见的;你现在不应该担心什么。 GetMessage 返回线程消息队列中的第一条消息。 TranslateMessage 将虚拟密钥消息转换为字符消息(WM_CHAR, WM_DEADCHAR,...)。魔法发生在里面 DispatchMessage。它将消息传递给正确的窗口窗口过程并管理所有内容,以便消息到达正确的收件人。 - IInspectable


答案:


关于消息和消息队列

具有多个线程的应用程序可以在每个创建窗口的线程中包含消息循环。

请注意,消息队列CAN支持多个窗口...第二个参数 GetMessage 是您要观看消息的窗口的句柄。如果 NULL 那么线程的所有窗口。

作为第二个注释,可以创建一个没有窗口的消息队列(至少从Windows 2000开始)。它在文档中描述 PostThreadMessage

在邮件将发布到的帖子中,请致电 PeekMessage 如此处所示强制系统创建消息队列。

PeekMessage(&msg, NULL, WM_USER, WM_USER, PM_NOREMOVE)

13
2017-08-07 18:56



凉。谢谢回答! - bodacydo