了解从 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);
}
我希望顺序应该是
- WM_KEYDOWN('a')
- WM_KEYDOWN('s')
- WM_KEYDOWN('f')
- /* 睡眠唤醒前排队 */
- WM_CHAR('a')
- WM_CHAR('s')
- WM_CHAR('f')
但是 print_the_message 实际上显示了这个排序
- WM_KEYDOWN('a')
- WM_CHAR('a')
- WM_KEYDOWN('s')
- WM_CHAR('s')
- WM_KEYDOWN('f')
- WM_CHAR('f')
由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.
这与观察到的行为相符。
下面是一个经典的消息循环。正如 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);
}
我希望顺序应该是
- WM_KEYDOWN('a')
- WM_KEYDOWN('s')
- WM_KEYDOWN('f')
- /* 睡眠唤醒前排队 */
- WM_CHAR('a')
- WM_CHAR('s')
- WM_CHAR('f')
但是 print_the_message 实际上显示了这个排序
- WM_KEYDOWN('a')
- WM_CHAR('a')
- WM_KEYDOWN('s')
- WM_CHAR('s')
- WM_KEYDOWN('f')
- WM_CHAR('f')
由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.
这与观察到的行为相符。