WM_CHAR、WM_KEYDOWN和WM_SYSKEYDOWN消息

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方法开始,按下表所述的逻辑顺序进行。(了解这个过程或许有助于对上面三个消息的理解)

方法说明结果
ProcessCmdKey此方法检查按键是否为命令键,例如快捷键或菜单快捷键如果方法返回true,则将不调度键消息,而且将不发生键事件
如果方法返回false,则将调用IsInputKey检查该键是否为常规输入键
IsInputKey此方法检查按键是否为常规输入键如果方法返回true,则表示该键为常规字符,将调用ProcessKeyMessage进行消息处理
如果方法返回false,则将调用ProcessDialogKey
ProcessDialogKey此方法检查按键是否为导航键,例如Esc、Tab、回车键或箭头键。
如果该控件不处理该键,则将调用基控件或父控件的ProcessDialogKey,直至层次结构中的最顶端控件。
如果此方法返回true,则完成消息预处理,而且将不生成键事件
如果此方法返回false,则将调用ProcessKeyMessage进行消息处理
ProcessKeyMessage此方法处理由控件的WndProc方法接收的所有键盘消息如果控件有父级,则调用父级的ProcessKeyPreview
如果控件没有父级或父级的ProcessKeyPreview不处理该消息,则调用ProcessKeyEventArgs
ProcessKeyPreview此方法将键盘消息发送到控件的父控件如果此方法返回true,则将不发生键事件
如果此方法返回false,则将调用ProcessKeyEventArgs
ProcessKeyEventArgs此方法引发KeyDown事件

 

[cpp]  view plain  copy
  1. BOOL CHBPlayerApp::PreTranslateMessage(MSG* pMsg)  
  2. {  
  3.  // TODO: Add your specialized code here and/or call the base class  
  4.  if (pMsg->message == WM_KEYDOWN)  
  5.  {  
  6.     switch (pMsg->wParam)  
  7.     {  
  8.     //屏蔽Esc消息  
  9.       case VK_ESCAPE:  
  10.                return true;  
  11.                break;  
  12.   //屏蔽回车键消息  
  13.   case VK_RETURN:  
  14.                return true;  
  15.                break;  
  16.   //组合键Ctrl+C  
  17.   case 'C':  
  18.               if(::GetKeyState(VK_CONTROL) < 0)  
  19.              {  
  20.               }  
  21.                break;  
  22.    //组合键Ctrl+Shift+S  
  23.   case 'S':  
  24.              if((::GetKeyState(VK_CONTROL) < 0) && (::GetKeyState(VK_SHIFT) < 0))  
  25.               {  
  26.               }  
  27.       return CWinApp::PreTranslateMessage(pMsg);  
  28. }  


在对话框中添加键盘响应事件

1. ClassView中Add Windows Message Handle 添加WM-KEYDOWN和WM-KEYUP,Add Virtural Functions添加PreTranslateMessage

2.         BOOL **Dlg::PreTranslateMessage(MSG* pMsg)中添加

[cpp]  view plain  copy
  1. {   
  2.        if (pMsg-> message == WM_KEYDOWN)  
  3.               {  
  4.                      if(pMsg-> wParam== VK_RETURN)//直接用虚码代替就可以响应所指键  
  5.                      SetInfo(WDK_OK);      //回车对应ok  
  6.               }  
  7.        if (pMsg-> message == WM_KEYDOWN)  
  8.               {  
  9.                      if(pMsg-> wParam== VK_BACK)//直接用虚码代替就可以响应所指键  
  10.                      SetInfo(WDK_C);         //backspace对应删除  
  11.               }  
  12.        return CDialog::PreTranslateMessage(pMsg);  
  13. }  


3. 组合键的用法:(本例响应Ctrl+X键)

[cpp]  view plain  copy
  1. BOOL CMydilog::PreTranslateMessage(MSG* pMsg)  
  2. {  
  3.         if (pMsg-> message == WM_KEYDOWN)  
  4.         {  
  5.                switch (pMsg-> wParam)  
  6.                {  
  7.                case VK_ESCAPE:  
  8.                            SetFocus ();  
  9.                            return TRUE;  
  10.                case 'X':  
  11.                           if(::GetKeyState(VK_CONTROL) < 0  
  12.                           MessageBox(" hello" );  
  13.                           return TRUE;  
  14.                }  
  15.         }  
  16.         return CDialog::PreTranslateMessage(pMsg);  
  17. }  




转发链接:https://blog.csdn.net/ccfxue/article/details/51121141

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值