前言
题目更准确的说法应该是c++如何实现模拟键盘按键?只不过习惯了Qt的环境开发而已。
现在的需求是需要通过软件来模拟按下热键以触发某些功能。比如说某截图软件的截图快捷键是ctrl + alt + A,我需要通软件来模拟按下这个组合键,以实现截图功能。
通常我们都是处理接收到的事件,例如我们可以获取键盘按下的事件,然后做一些响应,这种场景使用Qt的事件系统就可以实现了。但是现在我们相当于要发送事件,而且事件的接收者是别的程序,这时就需要借助操作系统的力量了。调用windows的api keybd_event。
关于keybd_event函数
keybd_event没有返回值,有四个参数,我们这里只要用到其中两个参数。
第一个参数是按键码(要操作哪个键),第三个参数操作标志(是按下还是弹起)。第二个参数(硬件扫描码)和第四个参数(操作的键的附加信息)有兴趣的可以研究一下。
模拟ctrl + alt + A
直接上代码:
代码一目了然,关键在于第一个参数和第三个参数怎么填(其他两个参数填0)。先说第三个参数0表示按下,2表示弹起。奇怪的是可以找到表示弹起的宏KEYEVENTF_KEYUP,找不到表示按下的宏:
关于第一个参数键码,ctrl键的宏定义VK_CONTROL,shift键的宏定义为VK_SHIFT,F1键的宏位VK_F1......... 数字键和ASCII的数字值是一样的,字母键的值和ASCII码的大写字母的值是一样的。
以上这些按键的键码都很好记,但是就是没找到alt的定义,经过测试它的值为VK_MENU。
最后需要注意,既然是系统api,自然需要包含系统的头文件: