自己动手,丰衣足食。普通键盘实现键盘宏(Windows和Mac版)「建议收藏」

自己动手,丰衣足食。普通键盘实现键盘宏(Windows和Mac版)「建议收藏」很多高端机械键盘,支持宏定义,例如我们可以设置”D”键为”dota”,这样当我们按一下宏开启键,再按一下”D”键,就等价于分别按了”d””o””t””a”四个键。这时就可以把一些敲代码时常用的模板定义成键盘宏,到时候一键补全代码,既高效又装X。另外,玩游戏时想按出“下前下前拳”这样的组合技能也容易多了。那么问题来了。。山里来的买不起机械键盘的穷B同时又是程序员应该怎么办。。其实这…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定

很多高端机械键盘,支持宏定义,例如我们可以设置”D”键为”dota”,这样当我们按一下宏开启键,再按一下”D”键,就等价于分别按了”d” “o” “t” “a”四个键。这时就可以把一些敲代码时常用的模板定义成键盘宏,到时候一键补全代码,既高效又装X。另外,玩游戏时想按出“下前下前拳”这样的组合技能也容易多了。

那么问题来了。。

山里来的买不起机械键盘的穷B同时又是程序员应该怎么办。。

其实这样简单的功能不一定非要硬件支持,借助一些现有软件模拟一下键盘就好了,在windows下有按键精灵和AutoHotKey这些神器,模拟起来很容易,而且体验非常完美。

我是借助按键精灵实现的,按键精灵语法很简单,例如 KeyPress “A”, 3 就表示按A键3次,而且支持全局快捷键启动,支持监听用户输入,真是简单到无情。

不过问题又来了。。

键盘宏主要是按一系列按键,如果每个按键都写一行 KeyPress “X”, 1 ,有的还得配合Shift键才能按出来,也是累,而且一行一句代码,看上去不直观,容易写错。

那就写个代码生成器就好了,我是用C语言+std::string实现的,直接把宏写成字符串,生成器自动输出相应的按键,粘贴到按键精灵中编译保存就好了。

贴一下代码:

自己动手,丰衣足食。普通键盘实现键盘宏(Windows和Mac版)「建议收藏」
自己动手,丰衣足食。普通键盘实现键盘宏(Windows和Mac版)「建议收藏」

  1 #include <stdio.h>
  2 #include <string.h>
  3 #include <stdlib.h>
  4 #include <ctype.h>
  5 #include <string>
  6 
  7 using std::string;
  8 
  9 enum class OpType {
 10     Press,
 11     Down,
 12     Up
 13 };
 14 
 15 enum class CombKey {
 16     Shift,
 17     Ctrl,
 18     Alt
 19 };
 20 
 21 void initTransHash(); //初始化按shift才能打出的字符
 22 void transfer(char c); //shift打出的字符转化为真正的按键
 23 void procOpType(OpType type); //输出按键操作
 24 void callKey(OpType type, char key, int count=1); //按键
 25 void callKey(OpType type, string key, int count=1); //重载,按功能键
 26 void keyComb(CombKey comb, char key); //组合键
 27 
 28 
 29 const int delay = 2;
 30 string transChar;
 31 char transHash[256];
 32 
 33 
 34 int main() {
 35     initTransHash();
 36     
 37     string keys = "function() {\n},";
 38     
 39     for(char key : keys) {
 40         if(strchr(transChar.c_str(), key) != NULL) {
 41             transfer(key);
 42         } else {
 43             if(isupper(key)) {
 44                 keyComb(CombKey::Shift, key);
 45             } else {
 46                 callKey(OpType::Press, key);
 47             }
 48         }
 49     }
 50 }
 51 
 52 void initTransHash() {
 53     memset(transHash, 0, sizeof(transHash));
 54     
 55     //
 56     //   ~ ! @ # $ % ^ & * ( ) _ + { } |  : \" < > ?
 57     //   ` 1 2 3 4 5 6 7 8 9 0 - = [ ] \\ ; '  , . /
 58     
 59     transChar = "~!@#$%^&*()_+{}|:\"<>? \n";
 60     string keys = "`1234567890-=[]\\;',./\0\0";
 61     
 62     // transChar空格后面的字符不加入hash表
 63     for(int i = 0; i < keys.size(); i++) {
 64         transHash[transChar[i]] = keys[i];
 65     }
 66 }
 67 
 68 void transfer(char c) {
 69     if(transHash[c]) {
 70         keyComb(CombKey::Shift, transHash[c]);
 71         return;
 72     }
 73     switch(c) {
 74         case '\n':
 75             callKey(OpType::Press, "Enter");
 76             break;
 77             
 78         case ' ':
 79             callKey(OpType::Press, "Space");
 80             break;
 81             
 82         default:
 83             printf("[Red] cant transfer: %c\n", c);
 84             break;
 85     }
 86 }
 87 
 88 void procOpType(OpType type) {
 89     switch(type) {
 90         case OpType::Press:
 91             printf("KeyPress "); break;
 92         case OpType::Down:
 93             printf("KeyDown "); break;
 94         case OpType::Up:
 95             printf("KeyUp "); break;
 96     }
 97 }
 98 
 99 void callKey(OpType type, char key, int count) {
100     procOpType(type);
101     printf("\"%c\", %d\n", islower(key) ? key-32 : key, count);
102     printf("Delay %d\n", delay); //每次按键后延迟10毫秒
103 }
104 
105 void callKey(OpType type, string key, int count) {
106     procOpType(type);
107     //printf("\"%s\"\n", key.c_str());
108     printf("\"%s\", %d\n", key.c_str(), count);
109     printf("Delay %d\n", delay); //每次按键后延迟10毫秒
110 }
111 
112 void keyComb(CombKey comb, char key) {
113     string combKey;
114     switch(comb) {
115         case CombKey::Shift:
116             combKey = "Shift"; break;
117         case CombKey::Ctrl:
118             combKey = "Ctrl"; break;
119         case CombKey::Alt:
120             combKey = "Alt"; break;
121         default:
122             return;
123     }
124     
125     callKey(OpType::Down, combKey);
126     callKey(OpType::Press, key);
127     callKey(OpType::Up, combKey);
128 }

Jetbrains全家桶1年46,售后保障稳定

按键精灵_键盘宏_代码生成器

然后把每一个键盘宏写成一个函数,通过按下按键精灵的全局快捷键启动,然后脚本监听用户按键,然后调用相应函数执行键盘宏就可以了,模板类似这样:

自己动手,丰衣足食。普通键盘实现键盘宏(Windows和Mac版)「建议收藏」
自己动手,丰衣足食。普通键盘实现键盘宏(Windows和Mac版)「建议收藏」

 1 choose = WaitKey()
 2 TracePrint choose
 3 
 4 Select Case choose
 5     Case 70
 6         KeyPress "BackSpace", 1
 7         Call F()
 8     Case 72
 9         KeyPress "BackSpace", 1
10         Call H()
11 End Select
12 
13 // 按下F键
14 Sub F()
15 End Sub
16 
17 // 按下H键
18 Sub H()
19 End Sub

按键精灵_键盘宏_模板

(宏键也会打印出来,所以我在调用函数打印键盘宏之前,调用BackSpace删除了宏键的字符)

 

然后问题又来了。。

上班用的是Mac,Mac没有按键精灵呀。最简单的办法是安装windows虚拟机,物理机和虚拟机共享代码目录,在虚拟机中敲代码,其他工作仍然在物理机中进行,不影响工作流。(其实用了5个月的Mac了,个人感觉,在新鲜感过了之后,实用性比windows差远了)

另外如果不想通过虚拟机的方式,还可以使用AppleScript,但是AppleScript本身没有像按键精灵那样的全局启动快捷键,可以通过Automator把AppleScript设置为系统服务,然后给服务设置快捷键,但是AppleScript不方便监听用户按键事件,目前我只能通过dialog读取用户输入,所以做不到按键精灵那样完美,上面的生成器的代码稍微改动一下,就能作为AppleScript的键盘宏生成器了,下面是AppleScript的模板:

自己动手,丰衣足食。普通键盘实现键盘宏(Windows和Mac版)「建议收藏」
自己动手,丰衣足食。普通键盘实现键盘宏(Windows和Mac版)「建议收藏」

 1 tell application "System Events"
 2     display dialog "choose" default answer ""
 3     set ans to text returned of result
 4     
 5     if ans = "p" then
 6         keystroke "1"
 7         keystroke "0"
 8         keystroke "0"
 9         keystroke "8"
10                 keystroke "6"
11     else
12         display dialog "unknown"
13     end if
14     
15 end tell

AppleScript_键盘宏_模板

但是焦点会被dialog获取,需要在键盘宏之前把接收键盘宏的进程设为最前。

tell process "XXXXXX"
    set frontmost to true
end tell

还是安装虚拟机好得多。。

转载于:https://www.cnblogs.com/wolfred7464/p/4778779.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/219261.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • [iOS]各种定时器–最全的定时器使用

    [iOS]各种定时器–最全的定时器使用

    2022年3月4日
    61
  • 带通滤波器电路图设计(转)

    带通滤波器电路图设计(转)转自:http://www.elecfans.com/dianlutu/187/20180224638878_a.html带通滤波器电路图设计(一)传统的带通滤波器设计方法中涉及了很多复杂的理论分析和计算。针对上述缺点,介绍一种使用EDA软件进行带通滤波器的设计方案,详细阐述了使用FilterPro软件进行有源带通滤波器电路的设计步骤,然后给出了在Proteus中对所设计的滤波器进行仿真分析和测试的方法。测试结果表明,使用该方法设计的带通滤波器具有性能稳定。设计难度小等优点,也为滤波器的设计提供了一个

    2022年5月29日
    41
  • Spring-Blog:个人博客(一)-Mybatis 读写分离

    Spring-Blog:个人博客(一)-Mybatis 读写分离2018,在平(tou)静(lan)了一段时间后,开始找点事情来做。这一次准备开发一个个人博客,在开发过程之中完善一下自己的技术。本系列博客只会提出一些比较有价值的技术思路,不会像写流水账一样记录开发

    2022年7月3日
    23
  • 在pycharm中写代码_pycharm运行部分代码

    在pycharm中写代码_pycharm运行部分代码在PyCharm中,你可以在「项目」中执行任意操作。因此,首先你需要创建一个项目。安装和打开PyCharm后,你会看到欢迎页面。点击「CreateNewProject」,出现「NewProject」弹窗:指定项目位置,打开ProjectInterpreter列表,选择创建新的项目解释器或者使用已有的解释器。选择「Newenvironmentusing」,打开其右方的下拉列表,选择Virtualenv、Pipenv或Conda。这些工具可以为不同项目单独创建P.

    2022年8月28日
    9
  • 一文搞定7大流行后端框架:Spring、Netty、MyBatis、Hibernate、Dubbo…「建议收藏」

    一文搞定7大流行后端框架:Spring、Netty、MyBatis、Hibernate、Dubbo…「建议收藏」框架(Framework)是整个或部分系统的可重用设计,表现为一组抽象构件及构件实例间交互的方法;另一种定义认为,框架是可被应用开发者定制的应用骨架。前者是从应用方面而后者是从目的方面给出的定义。可以说,一个框架是一个可复用的设计构件,它规定了应用的体系结构,阐明了整个设计、协作构件之间的依赖关系、责任分配和控制流程,表现为一组抽象类以及其实例之间协作的方法,它为构件复用提供了上下文(Context)关系。因此构件库的大规模重用也需要框架。今天给大家分享49篇【后端编程框架】相关精选学习资…

    2022年5月1日
    59
  • arcgis python二次开发_arcgis二次开发python_arcgis二次开发是什么_arcgis二次开发

    arcgis python二次开发_arcgis二次开发python_arcgis二次开发是什么_arcgis二次开发VS2013中ArcGIS二次开发部分问题问题解决方法VS2013中新建项目时没有ArcGIS模板解决办法:安装ArcGIS10.x会自动生成C:\ProgramFilesx86\MicrosoftVisualStudio10.0\Common7\IDE\ItemTemplates\CSharp\ArcGIS文件夹和C:\ProgramFilesx86\MicrosoftVi…

    2022年6月15日
    26

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号