gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 05:54:20 25 4
gpt4 key购买 nike

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

AFAIK 消息队列应该是一个FIFO 结构,当TranslateMessage 返回时,消息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')
  • /* sleep 唤醒前排队*/
  • 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.

这与观察到的行为相符。

关于c++ - 了解从 TranslateMessage() 发送的字符消息顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34542144/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com