了解从TranslateMessage()发送的字符消息顺序
Understanding the character message ordering sent from TranslateMessage()
下面是一个经典的消息循环。正如MSDN所说,TranslateMessage(const MSG*)确实将虚拟密钥消息(WM_KEYDOWN
)转换为字符消息(WM_CHAR
)。然后,它将把这个刚刚翻译的WM_CHAR
消息发布到线程消息队列中。
AFAIK消息队列应为FIFO结构,当TranslateMessage
返回时,消息WM_CHAR
将在队列末尾发送。我做了一个实验,同时按下多个键,例如"a"、"s"answers"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
- WM_KEYDOWN('f')
- /*睡眠唤醒前排队*/
- WM_CHAR('a')
- WM_CHAR
- WM_CHAR('f')
但是print_the_message实际上显示了这个排序
- WM_KEYDOWN('a')
- WM_CHAR('a')
- WM_KEYDOWN
- WM_CHAR
- WM_KEYDOWN('f')
- WM_CHAR('f')
TranslateMessage
创建的字符消息WM_CHAR
是否具有特殊的优先级或处理,以使其能够跟随前一条WM_KEYDOWN
消息并插队?
文档中强调:
字符消息被发布到调用线程的消息队列中,以便在下次线程调用GetMessage或PeekMessage函数时读取。
这与观察到的行为相匹配。
相关文章:
- C++字符*缓冲区的大小
- HEX值到wchar_t字符(UTF-8)的转换
- boost::进程间消息队列引发错误
- 为什么 Serial.println(<char[]>);返回随机字符?
- 如果用户输入的字符过多,则创建错误消息
- 字符* 文本消息[] 如何在内存中格式化?
- 如何将没有终止字符和大小的返回消息一起使用提升async_read?
- 从DLL文件调用消息框函数时出现奇怪的字符
- Arduino不支持使用websocket协议发送超过65535个字符的消息
- 套接字Java到C++-消息的长度总是8192个字符
- InternetGetLastResponseInfo返回奇怪的字符,而不是错误消息
- 网络消息格式化很多字符,int,在CC++中转换
- 使用发送消息设置文本框文本 设置文本仅发送字符串 win32 c++ 的第一个字符
- 了解从TranslateMessage()发送的字符消息顺序
- 在消息中显示每个字符的十六进制
- Zeromq:如何从python客户端向c++服务器发送超过30个字符的消息
- 消息框第一个字符或单词错误
- 从WM_KEYDOWN消息检测非字符按
- 当我使用 win32 发送消息发送和转换标准字符串时,我得到奇怪的字符
- 如何摆脱从格式消息A附加到错误消息的".rn"字符?