一个win32应用程序是否只有一个消息循环?还是每个窗口都有一个消息循环?

13

我对win32编程中的消息循环机制感到有些困惑。在我的 WinMain 函数中,我总是写下以下代码:

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

这是一个 while 循环,基本上会一直运行直到您的应用程序停止。这是否意味着您每个应用程序只有一个消息循环而不是每个窗口都有一个?


4
每个需要它的线程一个。您可以拥有由该线程驱动的任意数量的窗口。 - chris
5
每个线程最多有一个消息队列。通常每个消息队列只设置一个消息循环。对话框使用嵌套的消息循环,对客户端大部分是不可见的; 目前你并不需要担心这些。GetMessage 从线程的消息队列返回第一个消息。TranslateMessage 将虚拟键消息翻译为字符消息 (WM_CHAR, WM_DEADCHAR, ...)。真正的魔力在于 DispatchMessage 中。它将消息传递给正确的窗口过程,并管理所有操作以便消息能够到达正确的接收方。 - IInspectable
1个回答

15

来自关于消息和消息队列

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

请注意,消息队列可以支持多个窗口… GetMessage 的第二个参数是您要监视消息的窗口句柄。如果为空,则为该线程的所有窗口。

其次,可以在没有窗口的情况下创建消息队列(至少从Windows 2000开始)。它在PostThreadMessage文档中有描述:

在将消息发布到的线程中,按此处所示调用PeekMessage以强制系统创建消息队列。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接