前:所谓修饰键,就是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修改一下这个程序的相关字符串和图标就可以了:

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

4. VS2013的C++运行时库

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

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

三、程序下载:

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

C++自定义修饰键,实现如<Capslock+J>等组合键的按键映射的更多相关文章

  1. 给远程桌面发送“Ctrl+Alt+Delete”组合键

    首先: 在运行里,输入osk, 打开软键盘 然后,这时先按下本地键盘的Ctrl和Alt键,再点远程"软键盘"的"Del"键,成功发送"Ctrl+Alt ...

  2. 【黑金原创教程】【FPGA那些事儿-驱动篇I 】实验八:PS/2模块② — 键盘与组合键

    实验八:PS/2模块② — 键盘与组合键 实验七之际,我们学习如何读取PS/2键盘发送过来的通码与断码,不过实验内容也是一键按下然后释放,简单按键行为而已.然而,实验八的实验内容却是学习组合键的按键行 ...

  3. Win10 高频率使用的快捷组合键

    Win10 系统有很多的快捷组合键,学会使用这些快捷组合键可以节省一点时间 0x01 Win+D 显示或最小化桌面在键盘上按下Win+D可以切换显示桌面或最小化桌面所有内容: 0x02 Ctrl+Sh ...

  4. Mongoose 预定义模式修饰符 Getters 与 Setters 自定义修饰符

    mongoose 预定义模式修饰符 mongoose 提供的预定义模式修饰符,可以对我们增加的数据进行一些格式化,主要有:lowercase.uppercase .trim,这里不一一演示,对trim ...

  5. js简单的设置快捷键,hotkeys捕获键盘键和组合键的输入

    设置快捷键 这是一个强健的 Javascript 库用于捕获键盘输入和输入的组合键,它没有依赖,压缩只有只有(~3kb). hotkeys on Githubhotkeys预览 创建 您将需要在您的系 ...

  6. C# 如何捕获键盘按钮和组合键以及KeyPress/KeyDown事件之间的区别 (附KeyChar/KeyCode值)

    1. 首先将窗口属性KeyPreview设为true,如果属性对话框中找不到,就直接在代码里添加: 2. 添加KeyPress / KeyDown事件: 1.KeyPress 和KeyDown .Ke ...

  7. Qt获取组合键

    CTRL+Enter发送信息的实现 在现在的即时聊天程序中,一般都设置有快捷键来实现一些常用的功能,类似QQ可以用CTRL+Enter来实现信息的发送. 在QT4中,所有的事件都继承与QEvent这个 ...

  8. 这是高手最常用的第一快捷组合键 - imsoft.cnblogs

    1.锁定电脑 2.要找电脑上的文件时,一般人会先找到“我的电脑”,然后点击打开,而高手总是很酷的,轻轻按下键盘上的Windows键不放然后再按E键,直接打开电脑的资源管理器,而一般人还在慢慢寻找“我的 ...

  9. WScript.SendKeys()的sendkeys发送组合键以及特殊字符

    SendKeys.Send("^+{TAB}"); 使用SendKeys将键击和组合键击发送到活动应用程序.此类无法实例化.若要发送一个键击给某个类并立即继续程序流,请使用Send ...

随机推荐

  1. Android Volley框架的使用(5)

    6. 设置超时时间 可以为请求设置超时时间.最大重试次数.重试时间增长因子等.其中new DefaultRetryPolicy()的第一个参数是超时时间,第二个参数是最大重试次数.第三个参数是重试时间 ...

  2. 第 22 章 CSS3 渐变效果

    学习要点: 1.线性渐变 2.径向渐变 主讲教师:李炎恢 本章主要探讨 HTML5 中 CSS3 背景渐变功能,主要有两种渐变方式:线性渐变和径向(放射性)渐变. 一.线性渐变 CSS3 提供了 li ...

  3. Guava学习笔记:复写的Object常用方法

    在Java中Object类是所有类的父类,其中有几个需要override的方法比如equals,hashCode和toString等方法.每次写这几个方法都要做很多重复性的判断, 很多类库提供了覆写这 ...

  4. linux基础知识总结

    使用linux将近一年了,一直都没有时间来总结一下,借着最近在整理知识框架的机会总结一下linux的应用知识.   1.linux有两个目录很特殊,一个是~,另一个是/.两个目录的含义不一样,/是系统 ...

  5. jstl标签

    为什么提出jstl标签? Jsp中包含html标签+java片段+jsp片段使得jsp页面比较乱.提出:能不能把<% %>java片段用标签替换 jsp页面更简洁 <!-- 引入js ...

  6. asp.net mvc4 使用 System.Web.Optimization 对javascript和style的引入、代码合并和压缩的优化(ScriptBundle,StyleBundle,Bundling and Minification )

    Bundling and Minification两个单词对今天的内容有个比较好的总结. 问题所在 一. 在asp.net包括mvc项目中,引入js和css也许有人认为是个很容易和很简单操作的事情,v ...

  7. SQL Server 行转列重温

    转载自http://www.cnblogs.com/kerrycode/ 行转列,列转行是我们在开发过程中经常碰到的问题.行转列一般通过CASE WHEN 语句来实现,也可以通过 SQL SERVER ...

  8. java1.8的默认方法的坑

    默认方法: 接口的方法一直都是抽象方法,自从1.8出来了之后,新增了一个默认方法.可以在接口中实现方法 1.默认方法需要用default修饰 2.默认方法不能是静态的 3.子接口继承了2个相同签名的默 ...

  9. freeradius 安装出错的解决办法

    sudo apt-get install freeradius-mysql Selecting previously unselected package freeradius-mysql. (Rea ...

  10. Dense.js - 响应式的视网膜(Rtina)图像支持

    Dense 是一款 jQuery 插件,它提供一个简单的方法为设备提供精密像素比的图像,为你的网站带来视网膜支持,清除模糊,图像更清晰.通过简单地包括 jQuery 插件的页面上,就能实现响应式的视网 ...