在Classwzard 中Message Map中选择PreTranslateMsg,在函数中加入以下代码:
BOOL CDlgDlg::PreTranslateMessage(MSG* pMsg) 
{
switch (pMsg->message){
case WM_KEYUP:
case WM_KEYDOWN:
AfxMessageBox("key msg");
}

return CDialog::PreTranslateMessage(pMsg);
}

解决方案 »

  1.   

    请看MFC中的代码:
    BOOL CDialog::PreTranslateMessage(MSG* pMsg)
    {
        ...
        // allow tooltip messages to be filtered
        if (CWnd::PreTranslateMessage(pMsg))
            return TRUE;
        ...
        return PreTranslateInput(pMsg);
    }BOOL CWnd::PreTranslateInput(LPMSG lpMsg)
    {
        ASSERT(::IsWindow(m_hWnd));
        // don't translate non-input events
            if ((lpMsg->message < WM_KEYFIRST || lpMsg->message > WM_KEYLAST) &&
                (lpMsg->message < WM_MOUSEFIRST || lpMsg->message > WM_MOUSELAST))
                    return FALSE;
        return IsDialogMessage(lpMsg);
    }
    所以如果你要处理键盘消息的话,就要象Sunlet的示例那样处理。但要注意,如果你不想在你处理完后继续让Dialog处理,你就需要在你的case中return TRUE;
    建议你写一个函数处理如下:BOOL CMyDialog::PreTranslateMessage(MSG* pMsg)
    {
        if (IsMyKeyMessage(pMsg))
            return TRUE;    return CDialog::PreTranslateMessage(pMsg);
    }BOOL CMyDialog::IsMyKeyMessage(MSG* pMsg)
    {
        switch(pMsg->message)
        {
        case WM_KEYUP:
            ...
            return TRUE;
        case WM_KEYDOWN:
            ...
            return TRUE;
        }
        return FALSE;
    }
      

  2.   

    谢谢二位前辈指点!
    但是,都怪小弟心急,没有说清楚。我使用的是Win32 API和C创建的对话框。
    所以MFC代码对我不管用。
    麻烦各位前辈了 我该怎么办?如何为对话框添加快捷键??
      

  3.   

    可以使用SetWindowsHookEx(...)来实现;
        ...
        case WM_INITDIALOG:
            g_hHook = SetWindowsHookEx(WH_KEYBOARD, (HOOKPROC)SubclassAbout, g_hInst, GetCurrentThreadId());
            return TRUE;
        case WM_COMMAND:
            if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) 
            {
                UnhookWindowsHookEx(g_hHook);
                EndDialog(hDlg, LOWORD(wParam));
                return TRUE;
            }
            break;
        ...LRESULT CALLBACK SubclassAbout(int code, WPARAM wParam, LPARAM lParam)
    {
        switch (wParam)
        {
        case 0x41:
            MessageBox(NULL, "A&a", "", );
            break;
        ...
        }
        return CallNextHookEx(g_hHook, code, wParam, lParam);
    }