TranslateMessage消息翻译和DispatchMessage消息分发
TranslateMessage函数将虚拟键消息转换成字符消息。比如:
消息WM_KEYDOWN和WM_KEYUP组合产生一个WM_CHAR或WM_DEADCHAR消息。
消息WM_SYSKEYDOWN和WM_SYSKEYUP组合产生一个WM_SYSCHAR或 WM_SYSDEADCHAR 消息
然后放在队列中,等待下一次线程调用GetMessage或PeekMessage时被读出
// 主消息循环: while (GetMessage(&msg, NULL, 0, 0)) { if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) { if (msg.message==WM_KEYDOWN) { MessageBox(0, L"KeyDown1", 0, 0); } /* WM_KEYDOWN和WM_KEYUP组合产生一个WM_CHAR或WM_DEADCHAR消息。 消息WM_SYSKEYDOWN和WM_SYSKEYUP组合产生一个WM_SYSCHAR或 WM_SYSDEADCHAR 消息 放在队列中,等待下一次线程调用GetMessage或PeekMessage时被读出 将虚拟键消息转换为字符消息。 字符消息被送到调用线程的消息队列中,在下一次线程调用函数GetMessage或PeekMessage时被读出。 */ TranslateMessage(&msg); GetMessage(&msg, NULL, 0, 0); if (msg.message == WM_KEYDOWN) { MessageBox(0, L"KeyDown2", 0, 0); } if (msg.message == WM_CHAR){ MessageBox(0, L"Translate", 0, 0); } /* 该函数调度一个消息给窗口程序。通常调度从GetMessage取得的消息。 消息被调度到的窗口程序即是MainProc()函数 */ DispatchMessage(&msg); } }
会发现按下一个键后会产生WM_KEYDOWN消息,经过TranslateMessage翻译后组合生成WM_CHAR消息
然后投放到消息队列中,使用getMessage取出刚刚投放的消息,判断后,发现产生的是一个WM_CHAR消息。
TtanslateMessage函数仅为那些由键盘驱动器映射为ASCII字符的键产生WM_CHAR消息。
但是TranslateMessage不会丢弃原来的WM_KEYDOWN消息。依旧可以继续调用函数: WndProc(HWND, UINT, WPARAM, LPARAM)处理这个消息
case WM_KEYDOWN: MessageBox(0, L"Key Down", 0, 0); break;