理解从TranslateMessage()

时间:2015-12-31 06:29:18

标签: c++ windows winapi event-handling

以下是经典的消息循环。正如MSDN所说,TranslateMessage(const MSG*)确实将虚拟密钥消息(WM_KEYDOWN)转换为字符消息(WM_CHAR)。然后它会将这个刚刚翻译好的WM_CHAR消息发布到线程消息队列中。

AFAIK消息队列应该是 FIFO 结构,当WM_CHAR返回时,消息TranslateMessage将在队列末尾发送。我做了一个实验,同时按下多个键,例如'a','s'和'd'。在调用sleep(1000)之前,我先放置一个WM_KEYDOWN使这3条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')

WM_CHAR创建的字符消息TranslateMessage是否具有特殊优先级或处理能力,使其能够遵循先前的WM_KEYDOWN消息并切入队列?

1 个答案:

答案 0 :(得分:1)

我强调documentation说:

  

将字符消息发布到调用线程的消息队列中,以便在线程调用GetMessage或PeekMessage函数时读取

这符合观察到的行为。