zoukankan      html  css  js  c++  java
  • 一个简易的键盘按键测试程序

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

  • 相关阅读:
    Atitit  技术经理职责与流程表总结
    Atitit.pagging  翻页功能解决方案专题 与 目录大纲 v3 r44.docx
    Atitit 翻页功能的解决方案与版本历史 v4 r49
    Atitit 数据库表文档生成解决方案
    Atiit 常见功能 常用功能与模块的最快速解决方案
    Atitit 列出wifi热点以及连接
    Atiitt 使用java语言编写sql函数或存储过程
    Atitit 数据库 标准库  sdk 函数库 编程语言 mysql oracle  attilax总结
    Atitit 纯java项目的提升进度大法通用json dsl接口
    Atitit 数据融合merge功能v3新特性.docx
  • 原文地址:https://www.cnblogs.com/keke2014/p/3858742.html
Copyright © 2011-2022 走看看