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;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM