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


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

  • 相关阅读:
    LIKE语句也可以这样写
    a链接触发javascript函数导致innerHTML里的图片无法加载
    引用类型真屌
    网站建设心得
    SPAN
    Go! 环境配置和入门
    linux内核编译
    面试题
    KCMT开源控件之方便简洁的分页控件
    c#中out、ref和params的用法与区别
  • 原文地址:https://www.cnblogs.com/keke2014/p/3858742.html
Copyright © 2020-2023  润新知