我对win32编程中的消息循环机制感到有些困惑。在我的 WinMain
函数中,我总是写下以下代码:
while ( GetMessage ( &msg, NULL, 0, 0 ) > 0 )
{
TranslateMessage ( &msg );
DispatchMessage ( &msg );
}
这是一个 while 循环,基本上会一直运行直到您的应用程序停止。这是否意味着您每个应用程序只有一个消息循环而不是每个窗口都有一个?
来自关于消息和消息队列:
拥有多个线程的应用程序可以在每个线程中包含一个消息循环,创建窗口。
请注意,消息队列可以支持多个窗口… GetMessage
的第二个参数是您要监视消息的窗口句柄。如果为空,则为该线程的所有窗口。
其次,可以在没有窗口的情况下创建消息队列(至少从Windows 2000开始)。它在PostThreadMessage
文档中有描述:
在将消息发布到的线程中,按此处所示调用
PeekMessage
以强制系统创建消息队列。
PeekMessage(&msg, NULL, WM_USER, WM_USER, PM_NOREMOVE)
GetMessage
从线程的消息队列返回第一个消息。TranslateMessage
将虚拟键消息翻译为字符消息 (WM_CHAR
,WM_DEADCHAR
, ...)。真正的魔力在于DispatchMessage
中。它将消息传递给正确的窗口过程,并管理所有操作以便消息能够到达正确的接收方。 - IInspectable