了解从 TranslateMessage() 发送的字符消息顺序

Understanding the character message ordering sent from TranslateMessage()

下面是一个经典的消息循环。正如 MSDN 所说,TranslateMessage(const MSG*) 确实将虚拟键消息 (WM_KEYDOWN) 转换为字符消息 (WM_CHAR)。然后它将post这条刚刚翻译的WM_CHAR消息放入线程消息队列中。

AFAIK消息队列应该是FIFO结构,当TranslateMessage[=94时消息WM_CHAR将在队列末尾发送=].我做了一个同时按下多个键的实验,例如'a'、's' 和 'd'。我放了一个 sleep(1000) 来使这 3 个 WM_KEYDOWN 消息在调用 TranslateMessage() 之前先在消息队列中排队。

while (GetMessage(&msg, NULL, 0, 0))
{
    Sleep(1000) // make message queue receives all the WM_KEYDOWN before Translated                     
    TranslateMessage(&msg);
    DispatchMessage(&msg);

}

LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
     print_the_message(uMsg, wParam);
}

我希望顺序应该是

但是 print_the_message 实际上显示了这个排序

TranslateMessage创建的字符消息WM_CHAR是否有特殊的优先级或处理使其可以跟在前面的WM_KEYDOWN消息之后切入队列?

documentation 强调:

The character messages are posted to the calling thread's message queue, to be read the next time the thread calls the GetMessage or PeekMessage function.

这与观察到的行为相符。