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