在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);
}
BOOL CDlgDlg::PreTranslateMessage(MSG* pMsg)
{
switch (pMsg->message){
case WM_KEYUP:
case WM_KEYDOWN:
AfxMessageBox("key msg");
}
return CDialog::PreTranslateMessage(pMsg);
}
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;
}
但是,都怪小弟心急,没有说清楚。我使用的是Win32 API和C创建的对话框。
所以MFC代码对我不管用。
麻烦各位前辈了 我该怎么办?如何为对话框添加快捷键??
...
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);
}