【转】在对话框中响应键盘按键
我们首先想到的是响应WM_KEYDOWN消息,但实际运行却发现没有任何效果。
原因是对话框里的控件需要首先对按键作出响应,比如多行编辑框必须首先处理回车,不至于回车使对话框关闭。
我们要想在第一时间对对话框的按键做出响应,需要重载PreTranslateMessage,
以下的代码实现了在对话框中显示虚拟键值(virtual-key code)
BOOL CTestDlg::PreTranslateMessage(MSG* pMsg)
{
if(pMsg->message == WM_KEYDOWN)
{
///或者直接调用OnKeyDown
CString strwParam;
strwParam.Format("%d ",pMsg->wParam);
CDC* pDC = GetDC();
pDC->TextOut(10,10,strwParam);
ReleaseDC(pDC);
}
return CDialog::PreTranslateMessage(pMsg);
}
但要注意,如果你不想在你处理完后继续让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;
}
在MFC方式中-> CDlgDlg::PreTranslateMessage() 可接收到对话框的键盘消息.
在API方式中-> SetWindowsHookEx() 可接收到对话框的键盘消息.
注:有人说可以响应这个消息函数 OnGetDlgCode 然后在里面写 return DLGC_WANTALLKEYS。没有试过。

浙公网安备 33010602011771号