基於MFC對話框的應用程序在響應按鍵消息和熱鍵方面都力不從心,CDialog類的消息循環中去掉了TranslateAccelerator函數,所以不能響應熱鍵;同時因爲對話框上可能有不少控件,且默認狀況下這些子窗口已經截獲了焦點,所以鍵盤消息已經被控件捕獲了;同時爲了實現控件焦點切換和對話框默認行爲, VK_TAB、VK_LEFT、VK_RIGHT、VK_UP、VK_DOWN、 VK_RETURN、VK_ESCAPE 等鍵已經被截獲處理,所以對話框沒有控件時仍然不能徹底響應按鍵消息。app
BOOL CMyDlg::PreTranslateMessage(MSG* pMsg) { if(pMsg->message == WM_KEYUP) { // 響應keyup消息 if(pMsg->wParam == VK_RETURN) { // 回車 } } return CDialog::PreTranslateMessage(pMsg); }
BOOL CMyDlg::PreTranslateMessage(MSG* pMsg) { if(pMsg->message == WM_KEYDOWN) { // 組合鍵響應keydown消息 if( pMsg->wParam == VK_SPACE&& (GetKeyState(VK_SHIFT)& 0x8000)) { // 空格 + Shift } } else if(pMsg->message == WM_SYSKEYDOWN) { // Alt組合鍵響應syskeydown消息 if( pMsg->wParam == 'A'&& (HIWORD(pMsg->lParam) & KF_ALTDOWN)) { // A + Alt } } return CDialog::PreTranslateMessage(pMsg); }