WM_KEYDOWN和键盘响应
来源:互联网 发布:淘宝模特神速拍照 编辑:程序博客网 时间:2024/06/18 07:53
一、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);
}
五:
1. 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_KEYDOWN和键盘响应
- 基于MFC对话框的键盘消息响应 WM_KEYDOWN WM_CHAR消息
- 对话框响应WM_KEYDOWN消息
- 响应WM_KEYDOWN消息
- 对话框响应WM_KEYDOWN消息
- WM_CHAR,WM_KEYDOWN和WM_SYSKEYDOWN
- 监听和响应键盘通知
- 监听和响应键盘通知
- 如何让对话框响应WM_KEYDOWN消息
- MFC中键盘消息处理WM_KEYDOWN,WM_KEYUP
- WM_KEYDOWN
- WM_CHAR、WM_KEYDOWN和WM_SYSKEYDOWN消息
- WM_CHAR、WM_KEYDOWN和WM_SYSKEYDOWN消息
- WM_CHAR、WM_KEYDOWN和WM_SYSKEYDOWN消息
- WM_CHAR、WM_KEYDOWN和WM_SYSKEYDOWN消息
- WM_CHAR、WM_KEYDOWN和WM_SYSKEYDOWN消息
- WM_Char消息和WM_KeyDown消息!
- WM_CHAR、WM_KEYDOWN和WM_SYSKEYDOWN消息
- HDU 1754-I Hate It(线段树:单点更新,区间最值)
- JAVASCRIPT 多级嵌套引号
- 【ios报错】reason: 'Pushing a navigation controller is not supporte
- 使用Selenium 和Junit 进行WEB功能测试
- 保纳艺术2014夏季汝窑瓷器拍卖圆满收官
- WM_KEYDOWN和键盘响应
- Spark 性能相关参数配置详解-压缩与序列化篇
- 字符串函数sprintf / sprintf_s的陷阱
- sql server数据表转换成xml
- 二叉树中何为某一值的路径实现
- Properties的使用
- <chrono> <TCLAP>与<CImg>
- Android系统亮屏、锁屏、屏幕解锁事件(解决部分手机亮屏后未解锁即进入resume状态)
- 卸载了WebStorm