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;
