MFC-键盘消息
键盘消息
系统消息:
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 消息;
虚拟键代码
看:https://www.cnblogs.com/liming19680104/p/17112239.html
实例: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); }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· DeepSeek在M芯片Mac上本地化部署
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能
2022-02-20 halcon-fill_up填充区域
2021-02-20 游戏
2021-02-20 奥德赛
2019-02-20 双缓冲技术实现实时绘图
2019-02-20 绘图QPainter-字体
2019-02-20 绘图QPainter-画刷