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事件

BOOL CHBPlayerApp::PreTranslateMessage(MSG* pMsg)
{
 // TODO: Add your specialized code here and/or call the base class
 if (pMsg->message == WM_KEYDOWN)
 {
  switch (pMsg->wParam)
  {

//屏蔽Esc消息
  case VK_ESCAPE:
   return true;
   break;

//屏蔽回车键消息
  case VK_RETURN:
   return true;
   break;

//组合键Ctrl+C
  case 'C':
   if(::GetKeyState(VK_CONTROL) < 0)
   {
   }
   break;

//组合键Ctrl+Shift+S
  case 'S':
     if((::GetKeyState(VK_CONTROL) < 0) && (::GetKeyState(VK_SHIFT) < 0))
   {
   }
    return CWinApp::PreTranslateMessage(pMsg);
}

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

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);

}

F10 and ALT arent picked up by WM_KEYDOWN, you need WM_SYSKEYDOWN.
You need to add: case WM_SYSKEYDOWN:
if(pMsg->wParam == VK_F10)
TRACE("F10/n");
break ;

WM_CHAR、WM_KEYDOWN和WM_SYSKEYDOWN消息相关推荐

  1. WM_CHAR,WM_KEYDOWN和WM_SYSKEYDOWN

    WM_KEYDOWN和WM_CHAR都是键盘消息.TranslateMessage函数已经将按键消息转换成字符消息了,那么WndProc函数中需要对事件进行选择.如:键入"D"键, ...

  2. windows 编程 —— 消息与参数(滚动条、键盘、鼠标)

    目录: 滚动条 键盘 鼠标 滚动条ScrollBar 发送消息:WM_VSCROLL和WM_HSCROLL 参数wParam:wParam消息参数被分为一个低字组和一个高字组.wParam的低字组是一 ...

  3. Windows消息机制VC

    在Windows中,用户或系统中所发生的任何活动被当作事件来处理,例如,用户按下了鼠标按钮,就产生一鼠标事件.对于所发生的每一个事件,Windows将其转换成消息的形式放在一个称为消息队列的内存区中, ...

  4. windows 键盘消息的机制

    在Microsoft Windows 98中,键盘和鼠标是两个标准的使用者输入来源,在一些连贯操作中常产生互补作用.当然,鼠标在今天的应用程序中比十年前使用得更为广泛.甚至在一些应用程序中,我们更习惯 ...

  5. Win32 键盘事件 - 击键消息、字符消息、插入符号(光标)

    注:以下内容为学习笔记,多数是从书本.资料中得来,只为加深印象,及日后参考.然而本人表达能力较差,写的不好.因非翻译.非转载,只好选原创,但多数乃摘抄,实为惭愧.但若能帮助一二访客,幸甚! 以下内容主 ...

  6. 系统消息 -- 键鼠消息

    鼠标消息 在窗口显示区域鼠标消息 WM_MOUSEMOVE 当鼠标在窗口的显示区域移动时 WM_LBUTTONDOWN 按下鼠标左键 WM_LBUTTONUP 释放鼠标左键 WM_LBUTTONDBL ...

  7. 键盘(键盘基础,按键消息)

    在Microsoft Windows 98中,键盘和鼠标是两个标准的使用者输入来源,在一些连贯操作中常产生互补作用.当然,鼠标在今天的应用程序中比十年前使用得更为广泛.甚至在一些应用程序中,我们更习惯 ...

  8. 按键按动次数计数c语言,二、Windows按键消息—重复计数、OEM扫描码、扩充键旗标、内容代...

    重复计数 重复计数是该消息所表示的按键次数,大多数情况下,重复计数设定为1.不过,如果按下一个键之后,您的窗口消息处理程序不够快,以致不能处理自动重复速率(您可以在「控制台」的「键盘」中进行设定)下的 ...

  9. c语言按键模式切换,二、Windows按键消息—键的先前状态、转换状态、位移状态...

    键的先前状态 如果在此之前键是释放的,则键的先前状态为0,否则为1.对WM_KEYUP或者WM_SYSKEYUP消息,它总是设定为1:但是对WM_KEYDOWN或者WM_SYSKEYDOWN消息,此位 ...

最新文章

  1. 1 用python进行OpenCV实战之用OpenCV3实现图片载入、显示和储存
  2. MarkdownView:Markdown 文档预览视图组件
  3. 百度:这次在AI领域我要做领头羊
  4. 软件工程 第二周作业
  5. a java runtime envi_认识java
  6. linux中使用u盘和光驱的命令_Linux文件操作高频使用命令
  7. python折线图样式_Python金融应用之图表制作(二)
  8. 前端请求接口post_前端如何优雅地模拟接口请求?(给你的代码加点小意外)
  9. 洛谷 P1272 重建道路(树形DP)
  10. Matplotlib Toolkits:地图绘制工具
  11. Linux文件夹操作
  12. 微信小程序开发的完整人性化版攻略
  13. 招募3DGIS技术合伙人
  14. 知其然,不知其所以然
  15. python dataframe新增一列
  16. 深度学习要多深,才能读懂人话?|阿里小蜜前沿探索
  17. 【夜读】2022年最后10天,致自己!
  18. 栈的实现(C语言版)
  19. Linux全面解析讲解
  20. 【OpenCall】ICASSP2023通用会议理解及生成挑战赛邀请函

热门文章

  1. 10行代码-原生JS双向数据绑定演示
  2. [Ops]阿里云服务器上无法发送邮件的现象原因及解决
  3. 【OCP新题库】052最新题库解析-第5题
  4. nginx源码编译和集群及高可用
  5. 江西财经大学第一届程序设计竞赛 G题小Q的口袋校园
  6. 【TensorFlow系列】【五】利用inception v3 pb模型文件做预测
  7. VR的风口,让UWA借你一双翅膀
  8. 正则表达式快速入门(归纳版)
  9. 西部开源学习笔记BOOK2-《unit 4》
  10. Linux学习之CentOS(七)--CentOS下j2ee环境搭建