• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

Joke's Blog

Stay hungry, stay foolish - Steve Jobs
  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

一个简易的键盘按键测试程序

该小程序是大学同学托我给他们公司做的,没有酬劳,但是我还是很认真的做了,当是锻炼自己了。这是我写的第一个带有界面的程序,用的是 MFC,是因为在研一国庆时过了一遍《VC++深入详解》。

进过不断摸索、调试、完善,耗时一周多,完成于 2013/05/15,下面是一些回顾,有些细节已经遗忘。

源码托管在 Github:点击进入链接

源程序(不含源码):点击进入链接

 

程序分两大部分:

1、界面主程序,重载“PreTranslateMessage”函数,捕获击键并作相应处理;

2、但是有些特殊键“PreTranslateMessage”函数无法捕获,如:左右 Win 键、屏幕截取键、还有“音量”、”播放“等特殊功能键,就需要安装一个钩子来捕捉。我用动态库写了一个键盘钩子,没有必要,只是为了尝试一下 dll 的编写。

 

在“PreTranslateMessage”函数里要捕捉所有类型的按键:

1、一般字符键(WM_KEYDOWN);

2、系统键(WM_SYSKEYDOWN -- Alt,VK_MENU);

3、回车键(VK_RETURN);

4、屏幕截取键(VK_SNAPSHOT);

刚开始考虑不全,只能一步步调试完善。

 

重难点:

1、同编码按键的处理:左右shift、ctrl、alt;两个回车;逗号与截屏

2、屏蔽F1弹出帮助;

3、用 Hook 屏蔽 Win 键弹出 Win 菜单;

4、“屏幕截取键”是个特殊的按键,如果被系统截取,则只有Keyup,没有Keydown,所以需要用钩子屏蔽;

 

用到的数据结构 —— 哈希表,当时并不清楚地知道这就是哈希表,只是觉得这样用可以很方便地找到对应按钮:

1 CMFCButton* keys[256];
2 
3 ……
4 
5 // 初始化按键数组
6 keys[VK_ESCAPE] = &m_esc;
7 
8 ……

 

厂商的一些特殊要求:

1、按键可能会一直按着进行测试,或多次按下/弹起,他们要求按下时按钮要变色且按钮下陷,直到弹起后才恢复;

2、不管“Num Lock”是否锁定,小键盘都要作用为数字键盘。刚开始觉得这是个棘手的要求,因为“Num Lock”没锁定时,除了“5”,其他几个数字对应的编码是另外几个功能键的编码了,没法判断是不是数字键按下的。后来经过查阅资料发现当数字键映射为其他键时,“pMsg->lParam”域包含实际编码,否则pMsg->lParam为空,“pMsg->wParam”包含实际编码。

3、程序一直置顶;

4、界面可调大小,按钮要按比例缩放 -- 在界面初始化时保存控件坐标,在 OnSize 时按比例调整大小;

posted on 2014-07-21 16:45  keke2048  阅读(3391)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3