• C++自定义修饰键,实现如<Capslock+J>等组合键的按键映射


    前:所谓修饰键,就是Ctrl,Alt,Shift,Win这些按键。

    Update: 我使用AHK写了一个功能更丰富的脚本:https://github.com/h46incon/ModifierCustomizer

    一、功能:

    1. 能自定义新的修饰键
    2. 在这个修饰键的基础上可以定义新的组合快捷键
    3. 对于快捷键的功能,呃,只能进行映射到别的按键
    4. 如把<Capslock+J>映射至下方向键(Vim党的福音)

    制作这个工具的原因就是Vim用惯了,就不想使用方向键了。所以就想着能使用别的快捷键代替这几个方向键。

    而由于想使得这个程序更通用,就不想占用现有的快捷键,比如天知道<Ctrl+h>在哪个软件中会是什么功能。所以想法就是Ctrl,Alt,Shift,Win之外,能增加修饰键。比如就在左Shift键上方的Capslock键。(其实我把Capslock键和ESC键换过来了……)

    具体来讲,自定义修饰键的工作方式如下:

    • 当按下修饰键时,不触发这个按键,而是等待
      • 若直接弹起这个修饰键,则触发该按键:按下、弹起 两个事件
    • 若有普通键按下、弹起,则根据需要进行重映射。(这里需要将处于按下状态的重映射按键记录起来)
    • 若弹起修饰键时,仍要需要映射的键未弹起,则弹起这个按键

    二、实现:

    选择的语言是C++,然后配置文件是用xml储存的,xml解析的库是tinyxml2。

    1. 资源管理

    对于资源的管理使用的是RAII的方式,这些使用的是刘未鹏C++11(及现代C++风格)和快速迭代式开发这里提到的很方便的设施,用起来就像这样:

    FILE* conf_file = fopen(file_name, "r"); ScopeGuard close_conf_file( [&]{fclose(conf_file);} );

    另外,这里还有一个宏,所以你要是嫌麻烦的话,连close_conf_file这样的类名都不用自己起了……就像这样:

    #define SCOPEGUARD_LINENAME_CAT(name, line) name##line #define SCOPEGUARD_LINENAME(name, line) SCOPEGUARD_LINENAME_CAT(name, line) #define ON_SCOPE_EXIT(callback) ScopeGuard SCOPEGUARD_LINENAME(EXIT, __LINE__) (callback) // Acquire Resource1 ON_SCOPE_EXIT( [&] { /* Release Resource1 */ })

    2. 键盘事件相关的API

    • LowLevelConvertKeyInput: 用来在全局范围内接受键盘事件
    • keybd_event:向系统发送按键事件
    • SetWindowsHookEx: 添加系统钩子。由于这个钩子不需要插入别的程序的运行空间中,所以也不需要编译成DLL。
    • GetMessage,TranslateMessage,DispatchMessage:消息循环

    3. 托盘

    用goagent的托盘:https://github.com/goagent/taskbar

    做了一些修改:比如删掉了托盘菜单的一些项目,并增加了窗口延迟隐藏的选项。

    使用VS2013可以打开这个项目,但是API有了一些变化了。需要把taskbar.cpp文件的第123行改一下(只是结构体成员的名字变了)。

    编译好之后,他默认会打开cmd.exe。然后使用Reshacker修改一下这个程序的相关字符串和图标就可以了:

    image

    至于这么难看的图标嘛,不要在意细节……然后我是用PS直接生成的ICO,256*256的,所以有点大了哈……

    image

    4. VS2013的C++运行时库

    VS2012开始(VS2010不知道,08还不会),默认情况下编译出来的程序需要额外的运行时库了。但是咱编个几百行代码的程序,也不想弄得这么麻烦。

    这里需要修改一下使用的运行时库,即将默认/MD选项改为/MT。改好之后编出来的程序就可以直接扔到别的电脑上跑了(XP的话仍需要另外设置)

    image

    三、程序下载:

    image

    http://files.cnblogs.com/h46incon/KeyRemaper.zip

  • 相关阅读:
    XML 加密、解密
    word 转 pdf
    PowerDesigner(PowerDesigner15.1.0.2850)下载、安装以及破解
    SQL 2005 18456
    SQL 2005端口的修改
    SQL——统计查询
    由于启动用户实例的进程时出错,导致无法生成 SQL Server 的用户实例 解决办法
    ASP.NET MVC中Model View Controller的开发顺序
    使用Windows身份验证的Intranet网站安全管理 Windows Authentication
    ASP.NET web.config中数据库连接字符串connectionStrings节的配置
  • 原文地址:https://www.cnblogs.com/h46incon/p/3581952.html
Copyright © 2020-2023  润新知