pyqt的全局键盘热键

**

pyqt或qt默认不支持全局鼠标事件和全局键盘事件。以下将介绍全局键盘热键的写法:

**

全局键盘事件需要调用win32 api的功能。首先说明python自带的pywin32并不完整,所以我们要直接调用系统win32dll。但是我还是要说一下pywin32的安装。

1.网上的教程一般都用到了pyHook这个库。但是我用的python3,所以需要一些特别的步骤来弄出python3版的pyHook。

http://blog.csdn.net/bo_mask/article/details/76002273
这里是详细的搞法,值得注意的是我期间遇到的一些问题。
安装完运行库以后swig.exe还是无法编译,于是我又安装了vs2015构建工具。就可以了。
其实网上已经有人给出了编译好的版本,不过我没亲自试验过。嫌上面步骤比较麻烦的可以下载试试看。
http://download.csdn.net/download/shangkumi/10139865
只找到这个3.5版本的,但是我是3.6.。。所以嘛~~自力更生喽~

安装pywin32时需要下载与python对应的版本。不管你电脑是32位还是64位,pywin32的版本和位数以python的版本和位数为主。否则位数不对,以后会报错!!

http://www.cnblogs.com/min0208/archive/2012/05/24/2515584.html
这个是安装pywin32.exe时安装不上的原因。主要是python路径加入注册表就可以正常安装了。方法很好用。

这时,所有都已经安装好,发现效果并不是很好用,键盘事件和鼠标事件都有bug,我没能解决。

2.下定决心直接调用win32dll开搞。

开搞之前先理清几个问题。

win32的api一共三个dll。
http://blog.csdn.net/xdc_zy/article/details/76359094?locationNum=5&fps=1

这里我告诉你们一个很好的方法,下载一个dll查看器,可以很方便的查看各个dll里面的函数名。
因为你在调用时不清楚你想要的函数在哪个dll里面。

RegisterHotKey这个函数在windll.user32里面。
调用需要ctypes

from ctypes import  windll

然后这样直接调用。也可以按照如下方法调用。看自己喜好~~

windll.user32.RegisterHotKey()

http://blog.csdn.net/vagrxie/article/details/5252302
我仔细研究过这篇文章。。。没办法,人家水平太高,我就分享一下我的阅读经验吧。

prototype = WINFUNCTYPE(c_bool, c_int, c_int, UINT, UINT)

paramflags = (1, 'hWnd', 0), (1, 'id', 0), (1, 'fsModifiers', 0), (1, 'vk', 0)

self.RegisterHotKey = prototype(('RegisterHotKey', windll.user32), paramflags)

r = self.RegisterHotKey(c_int(self.winId()), 0x0000, 0, 4)

if not r:
    print("不知道啥原因,总之失败了~~")

上面是另一种调用方法,非常高端大气。下面我们来解析一下到底是啥意思。

前两行都是c的数据类型。这样写可以保证类型明确。
用到了ctypes的WINFUNCTYPE函数

from ctypes import WINFUNCTYPE, c_bool, c_int

from ctypes.wintypes import UINT

http://blog.csdn.net/u010786109/article/details/41890131?locationNum=8&fps=1
这里是一些ctypes的介绍,不过我是没耐心看完了。你们加油~

paramflags里面是参数名。结合这个参考。
http://baike.sogou.com/v8031454.htm?fromTitle=RegisterHotKey

当然,这些都不是最主要的,只要你调用的时候参数类型搞对就行了,不用非得按照第二种方法来。其实直接windll.user32.RegisterHotKey()也挺好的。

准确的来说WINFUNCTYPE返回了函数指针。这样的话就有了第三行self.RegisterHotKey的调用。
它的第一个参数是个返回值,不填的话你可以试试嘛~~嘿嘿,你懂得。

**下面讲一讲这个函数的参数问题:
窗口句柄,系统可以根据这个句柄找到是哪个程序调用的这个函数。然后给它‘特殊’照顾
键码id,自己随便填,用来表示这个热键的名字。没啥用。
辅助键码,0是没有,其他的可以根据情况来弄,ctrl,alt,tab,都可以,不过要填虚拟键码。
热键键码,填啥就是啥,鼠标的不管用,键盘的管用。
http://baike.sogou.com/v374687.htm
关于键码对应的数字可以从这里面找。左边是十进制,右边是十六进制。推荐直接填十进制。好搞。**

上面只是调用了这个函数。意思就是告诉系统,我要注册热键。所以,按下热键时,系统会主动给程序发消息。但是这个消息要怎么接受呢?

上面大神用的winEventFilter这个事件,但是在qt5里面已经换成了nativeEvent事件,它位于Qwidget里面。大家可以通过文档查看。
http://doc.qt.io/qt-5/qwidget.html

from ctypes.wintypes import *

def nativeEvent(self, eventType, message):
    msg2 = ctypes.wintypes.MSG.from_address(message.__int__())#ctypes.wintypes
    if msg2.message == 0x0312:
        print("成功了吧~~")
        return False,message

注意,事件返回值很重要。一般返回假,因为真时会阻塞,卡死。
msg2是把参数message进行转换,否则同样不行。
0x0312就是WM_HOTKEY拉,因为python不知道啥原因。那些东西都没有被定义,所以只能输入数字拉~~

完整代码朕就不贴了,反正也说的差不多了。如果有纰漏再补充吧。
还有就是特别感谢群主大大的帮助。群号246269919
如果有什么疑问可以进群艾特我,我叫柯哀

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
Linux下的PyQt虚拟键盘是一种软件工具,它允许用户在没有物理键盘的设备上模拟键盘输入。 PyQt是一个基于Python语言的图形用户界面(GUI)开发工具包,它提供了多种功能和工具,可以用于开发各种类型的程序,包括虚拟键盘。 虚拟键盘在一些特定场景下非常有用。比如在一些设备上,由于空间限制或其他原因无法使用物理键盘,这时通过软件实现一个虚拟键盘可以提供方便的用户输入操作。 在Linux系统中,我们可以使用PyQt来开发一个虚拟键盘应用程序。这个应用程序可以使用PyQt提供的图形界面组件来创建一个界面,其中包括模拟的按键按钮。当用户点击这些按钮时,相应的键盘输入就会被模拟发送到系统。 实现虚拟键盘的关键是需要处理按键事件。在PyQt中,我们可以使用事件处理机制来监听按钮的点击事件,并在事件发生时执行相应的操作。通过一些特定的函数和方法,我们可以将模拟的键盘输入发送给系统,从而实现虚拟键盘的功能。 总结来说,Linux下的PyQt虚拟键盘是一种通过软件实现的工具,它可以模拟物理键盘的输入功能。我们可以利用PyQt提供的功能和组件来创建一个界面,并通过事件处理机制来实现按钮点击事件的监听和键盘输入的模拟发送。这样,用户就可以在没有物理键盘的设备上进行方便的输入操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值