该小程序是大学同学托我给他们公司做的,没有酬劳,但是我还是很认真的做了,当是锻炼自己了。这是我写的第一个带有界面的程序,用的是 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 时按比例调整大小;