键盘消息
系统消息:
ALT,F1,——F24等,是由系统内部处理的,程序本身就存在,比如F1是帮助键。
WM_SYSKEYDOWN 按下系统键
WM_SYSKEYUP 松开系统键
WM_SYSCHAR 输入一个系统字符
WM_SYSDEANCHAR 输入一个系统死字符
说明:不可产生显示字符的一般都是系统键;
非系统消息:
是由我们自己加上去的,
WM_KEYDOWN 按下非系统键
WM_KEYUP 松开非系统键
WM_CHAR 输入一个非系统字符
WM_DEADCHAR 输入一个非系统死字符
说明:死字符指的是本身不能显示,但可以修改其他字符的字符;
按键和松开按键消息通常是成对出现的:
当按键按下,松开时,产生三条消息,<按下按键消息><字符消息><松开按键消息>
当用户按键,按住键一定的时间时键盘就会启动重覆性特性,系统就会产生一系列的 WM_KEYDOWN 或者 WM_SYSKEYDOWN消息
在用户释放按键时,才产生一条 WM_KEYUP 或 WM_SYSKEYUP
当用户按下键盘的某一按键时,首先产生WM_KEYDOWN消息,由该响应函数中的 TranslateMessage 函数,翻译成 ANSI 字符集之后再响应 WM_CHAR 消息,再响应 WM_KEYUP 消息;
实例:WM_KEYDOWN, WM_KEYUP 键盘消息
WM_KEYDOWN响应所有按键消息(Alt键///Print Screen SysRq截屏键不响应)
1.添加WM_KEYDOWN, WM_KEYUP 键盘消息
右击窗口-->类向导---添加2个消息
2.代码
void CMFCtestDlg::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) //按下非系统键
//nChar 是虚拟键吗或ASCII吗
//nRepCnt 重复计数(用户按住键引起的重复击键数目)【实测:返回的值都是1,不知为何?】
//nFlags 指定了扫描码、暂态键码、原来的键状态和上下文代码,如下面的列表所示:
// 0-7 扫描码(依赖于OEM的值)。高位字的低字节
// 8 扩展键,比如功能键或数字键盘上的键(如果它时扩展键则为1)
// 9-10 未使用
// 11-12 Windows内部使用
// 13 上下文代码(如果按下键时ALT键时被按下的,则为1;否则为0)
// 14 原来的键状态(如果在调用之前键时按下的,则为1;如果键是弹起的,则为0)
// 15 暂态(如果键正在被释放,则为1;如果键正被按下,则为0)
{
if (nChar == 66) //如果按下的B键
//66 是B(大写)的ASCII吗
{
WriteConsole(hStdout, ch, len, NULL, NULL);//在控制台输出
str1.Format(_T("%d"), nRepCnt); //把数值转换成字符串
str = str1 + _T("\r\n");
WriteConsole(hStdout, str, _tcslen(str), NULL, NULL);
}
CDialogEx::OnKeyDown(nChar, nRepCnt, nFlags);
}
WM_CHAR消息
WM_CHAR消息只响应字符按键和部分控制符
有很多控制字符不响应 不响应的键如下:Tab键 Caps Lock大小写切换键 ESC键 F1~F12 SHIFT CTRL ALT 方向键 方向键上方键盘区 Num Lock键
WM_CHAR区分大小写和SHIFT+数字,而WM_KEYDOWN只返回大写字母没有SHIFT作用
注意:如果想要主窗体响应WM_CHAR 消息,必须重载PreTranslateMessage来相应的实现
BOOL CMFCApplication9Dlg::PreTranslateMessage(MSG* pMsg)
{
// TODO: 在此添加专用代码和/或调用基类
if (pMsg->message == WM_CHAR && pMsg->wParam >= '0' && pMsg->wParam <= '9')
{
CString a;
a.Format(L"%c", pMsg->wParam);
MessageBox(a);
}
return CDialogEx::PreTranslateMessage(pMsg);
}