win32消息泵,do dispatchMessage()处理整个消息队列或仅仅是顶部消息

Win32 message pump, does DispatchMessage() handle entire message queue or just top message?

本文关键字:消息 队列 仅仅是 顶部 处理 do dispatchMessage win32      更新时间:2023-10-16

所以我一直在阅读Win32消息泵上,我很好奇dispatchMessage()函数是否涉及整个消息队列,或者只是队列顶部的消息?

例如,我看过诸如:

的循环
while(true) 
{
    MSG  msg;
    if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
    {
        if (msg.message == WM_QUIT) 
        {
            break;
        } 
        else 
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    } 
    do 
    {   
    } while (clock.getTimeDeltaMilliseconds() < 1.66f); // cap at 60 fps
    // run frame code here
}

在此示例中,每个消息都会被处理,还是此循环结构仅导致每帧处理一条消息?

如果一次只处理一条消息,我应该将if(peekmessage)语句更改为一段循环以确保处理所有消息吗?:

while(true) 
{
    MSG  msg;
    while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
    {
        if (msg.message == WM_QUIT) 
        {
            return;
        } 
        else 
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    } 
    do 
    {   
    } while (clock.getTimeDeltaMilliseconds() < 1.66f); // cap at 60 fps
    // run frame code here
}

它仅处理顶部消息。MSG是一种结构,该结构具有有关一个消息的信息,在调用GetMessagePeekMessage时填写,前者是阻止功能。然后,您将有关一条消息的信息传递给DispatchMessage

如果要在循环中进行的其他操作之前处理整个消息队列,则应将该部分包装在循环中。

DispatchMesasge与消息队列无关,它仅处理您传递给它的消息,从消息队列中删除消息的实际函数是PeekMessage,它只会删除或查看一个消息,因此,您是对的,您应该使用while循环来处理队列中的所有消息