首先我想说我这新开的一栏是用来记录我在生活中和工作中遇到的一些问题,其他大佬看到我问题的解决方案有更好的解决办法,非常欢迎也非常希望能够和各位大佬们讨论。
首先我收到的一个小项目中就要求要制作一个UI界面,然后通过按钮模拟键盘的一些组合键来实现一些要求,我百度了网上的很多中做法,网上给的方法具体如下*
QKeyEvent tabKey(QEvent::KeyPress, Qt::Key_Tab, Qt::NoModifier);
QCoreApplication::sendEvent(this, &tabKey);
QKeyEvent tabKey(QEvent::KeyPress, Qt::Key_Tab, Qt::ShiftModifier);
QCoreApplication::sendEvent(this, &tabKey);
但是这种方法我试了一下,真的不行!!!刚开始我以为是我使用的姿势不对,再经过换电脑,换重新卸载安装后,还是不行,那叫一个气啊,我就知道,网上这个方法是骗人的,傻乎乎的我居然还试了好几次,还有什么要先处理对焦什么的,我真想一拳把他们的头都给锤爆。
然后还有就是空说一堆,理论说得玄乎玄乎的,然后一行代码都没看见,遇到这样的答复的,我直接直呼内行,是想更人类懂王肩并肩吗。
最后我自己搞鼓了一会,翻了一下C++和QT的帮助文档,经过尝试后还是发现用下面这种方法来模拟键盘输入最靠谱。前提是在windows下,关于在ubuntu下执行类似操作我还在搞鼓中,一有结果将立马发博客告知。因为ubuntu下没有该api
UI界面其实就一个按钮就行,我这里因为还要实现其他功能,所以加了其他控件,当然,如果你们对这些控件的实现也感兴趣的话可以留言,留言的话我也会抽空吧整个项目的实现通过博客写出来。
这里主要是实现键盘模拟的功能,其他功能是打开文件浏览文件并显示在下面的大框框中的功能,有兴趣的话就留言,如果有留言那我贵抽时间写一下相关功能的实现。
首先我们明确目标,按钮按下,可以模拟键盘任何按键的按下,不管多少都可以实现
这里就先傻瓜式教学一下吧,先对键盘模拟按钮右键点击转到槽,选择clicked()函数,然后这个函数里面写代码
代码我直接附上,然后再解释
//按下
keybd_event(VK_CONTROL,0,0,0);//模拟ctrl按键按下
keybd_event(VK_MENU,0,0,0); //模拟alt按键按下
keybd_event(VK_TAB,0,0,0);//模拟tab键被按下
//弹起
keybd_event(VK_CONTROL,0,2,0); //模拟ctrl按键抬起
keybd_event(VK_MENU,0,2,0); //模拟alt按键抬起
keybd_event(VK_TAB,0,2,0);//模拟tab键被抬起
这里我是模拟了QQ自带的截图的快捷键按下,这里我解释一下,首先看如下:
#define
KEYEVENTF_EXTENDEDKEY 0x0001
#define KEYEVENTF_KEYUP 0x0002
#if(_WIN32_WINNT >= 0x0500)
#define KEYEVENTF_UNICODE 0x0004
#define KEYEVENTF_SCANCODE 0x0008
#endif /* _WIN32_WINNT >= 0x0500 */
WINUSERAPI
VOID
WINAPI
keybd_event(
_In_ BYTE bVk,
_In_ BYTE bScan,
_In_ DWORD dwFlags,
_In_ ULONG_PTR dwExtraInfo);
#endif /* WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) */
这是关于keybd_event的相关,其中我们可以看出模拟按键抬起是KRYEVENT_KEYUP,相对应的数值是2,用法在下面也有,具体的用法在microsoft的开发人员帮助文档里也有,这里为了方便,我直接附上链接开发人员帮助文档之keybd_event的使用
然后关于第一个参数的键盘按键码,我也给出链接,非常的全vk系列的模拟键盘码
最后的最后!非常重要,在使用该函数时候,一定要加上专属的头文件。如下:
#include
#include
#pragma comment(lib,"user32.lib")
不然编译不会通过的。
编译效果图我就不放了,基本通过了并且用的是keybd_event那肯定是能够执行的,不过这里还是要多提一句,如果觉得执行得太快了的话,可以在按下和抬起之间添加时间延迟函数例如如下:
//按下
keybd_event(VK_CONTROL,0,0,0);//模拟ctrl按键按下
keybd_event(VK_MENU,0,0,0); //模拟alt按键按下
keybd_event(VK_TAB,0,0,0);//模拟tab键被按下
//时间延迟函数
QThread::msleep(50);//延迟50毫秒,如果使用的话,记得也要加上头文件#include
//弹起
keybd_event(VK_CONTROL,0,2,0); //模拟ctrl按键抬起
keybd_event(VK_MENU,0,2,0); //模拟alt按键抬起
keybd_event(VK_TAB,0,2,0);//模拟tab键被抬起
最后,如果这篇文章能够帮助到你,还请点个赞吧,谢谢。