WM_KEYDOWN和WM_CHAR都是键盘消息。TranslateMessage函数已经将按键消息转换成字符消息了,那么WndProc函数中需要对事件进行选择。如:键入“D”键,就应该选择WM_CHAR,因为WM_CHAR 只是字母,不包含特殊字符如Ctrl等。 如果键盘键入的是“Ctrl+D”,则应该选择WM_KEYDOWN,因为WM_KEYDOWN既包含字母也包含特殊字符。 WM_CHAR是由WM_KEYDOWN消息Translate()之后产生的,然后再发送给窗口过程。例如按下“D”键,产生WM_KEYDOWN消息,此消息经过Translate()处理后变成了WM_KEYDOW、WM_CHAR两个消息传递给窗口过程。 而WM_SYSKEYDOWN是接受快捷键或系统命令按键的,像Alt键就是。所以捕获Alt键时,在WM_KEYDOWN下是无效的,要在WM_SYSKEYDOWN中。Ctrl和shift不属于WM_SYSKEYDOWN。 键盘消息的处理从PreProcessMessage方法开始,按下表所述的逻辑顺序进行。(了解这个过程或许有助于对上面三个消息的理解) 方法 说明 结果
BOOL CHBPlayerApp::PreTranslateMessage(MSG* pMsg) //屏蔽Esc消息 //屏蔽回车键消息 //组合键Ctrl+C //组合键Ctrl+Shift+S 在对话框中添加键盘响应事件 1. ClassView中Add Windows Message Handle 添加WM-KEYDOWN和WM-KEYUP,Add Virtural Functions添加PreTranslateMessage 2. BOOL **Dlg::PreTranslateMessage(MSG* pMsg)中添加 { if (pMsg-> message == WM_KEYDOWN) { if(pMsg-> wParam== VK_RETURN)//直接用虚码代替就可以响应所指键 SetInfo(WDK_OK); //回车对应ok } if (pMsg-> message == WM_KEYDOWN) { if(pMsg-> wParam== VK_BACK)//直接用虚码代替就可以响应所指键 SetInfo(WDK_C); //backspace对应删除 } return CDialog::PreTranslateMessage(pMsg); } 3. 组合键的用法:(本例响应Ctrl+X键) BOOL CMydilog::PreTranslateMessage(MSG* pMsg) { if (pMsg-> message == WM_KEYDOWN) { switch (pMsg-> wParam) { case VK_ESCAPE: SetFocus (); return TRUE; case 'X': if(::GetKeyState(VK_CONTROL) < 0 MessageBox(" hello" ); return TRUE; } } return CDialog::PreTranslateMessage(pMsg); }
|
|