首页 > 编程语言 >python实现自己的全局热键的第2种方法

python实现自己的全局热键的第2种方法

时间:2023-09-10 10:45:59浏览次数:49  
标签:ctrl python self 热键 key hotkey 全局 alt

之前有过一版python实现的全局热键, 但是在实际运行中发现, 有时候不太灵敏, 明明按下了目标热键, 为什么没有反应呢? 通过定位发现, 有时候键盘勾子捕获不到ctrl down消息, 特别是一段时间不操作电脑后容易出现这种情况, 这时候ctrl键确实处于按下的状态(通过GetKeyState函数可以获取到当时的状态).
于是我又重新实现了一版热键功能, 如下代码:

class HotkeyMatch2:
    def __init__(self,hotkey:str):
        '''hotkey: 形如: 'ctrl+a';'''
        self.hotkey = hotkey
        self.keys = hotkey.split('+')   # 热键的列表
        self.target_key = 'VK_' + self.keys[-1].upper()  # 目标键, 形如'VK_A'
        # 确定目标ctrl键和alt键状态, True表示被按下
        self.target_ctrl = 'ctrl' in self.keys
        self.target_alt = 'alt' in self.keys
    def is_match(self,key:str,etype:str)->bool:
        '''
        key: 形如: VK_A
        etype: 形如: DOWN|UP
        返回值: True: 表示热键匹配, 否则表示不匹配
        '''
        if etype!='DOWN': return False  # 只接受down消息
        if key!=self.target_key: return False   # 判断是否是目标键
        if is_control_pressing()!=self.target_ctrl: return False  # 判断ctrl键是否按下
        if is_alt_pressing()!=self.target_alt: return False  # 判断alt键是否按下
        return True

def add_hotkey2(hotkey:str,callback:callable):
    '''
    增加一个热键
    hotkey: 形如: 'ctrl+a'
    callback: 回调函数: void f()
    '''
    hotkey_match = HotkeyMatch2(hotkey)
    def on_key(key:str,etype:str)->bool:
        result = hotkey_match.is_match(key,etype)
        ctx = msg.Context() # 订阅消息的回调函数的返回对象
        ctx.tag = result
        if result==True:    # 触发热键
            cmn.run_in_thread(callback)()   # 在新线程中运行回调函数
            ctx.discontinued = True
        return ctx
    msg.sub('23090501_KeyMsg',on_key)   # 订阅键盘消息

add_hotkey = add_hotkey2

初步测试, 应该是解决了问题.

标签:ctrl,python,self,热键,key,hotkey,全局,alt
From: https://www.cnblogs.com/huzhongqiang/p/17690847.html

相关文章

  • Python对列表去重的4种方法
    开发中对数组、列表去重是非常常见的需求,对一个list中的id进行去重,有下面几种方法,前面两种方法不能保证顺序,后面两种方法可以保持原来的顺序。下面的代码都在Python3下测试通过,Python2下请自行测试1.使用set的特型,python的set和其他语言类似,是一个无序不重复元素集1234orgList......
  • Python日志库Loguru教程
    1.为什么选用logurupython自带的logging模块,需要完成复杂的配置才能很好的使用,基本生产环境都需要进行二次包装。loguru专门梳理了这方面的问题,可以通过简单直接的配置完成你的需求。简单的例子:fromloguruimportloggerlogger.info("hellofromloguru")输出到标准输出......
  • 【Python基础】字符串常用方法
    replace()方法replace()方法把字符串中的old(旧字符串)替换成new(新字符串),如果指定第三个参数max,则替换不超过max次。str="ThisisATest"print(str.replace("is","was"))#ThwaswasATest"print(str.replace("is","was",1))#Thwas......
  • python爬虫练习2-百度热榜
    importrequestsfromlxmlimportetreeurl='https://top.baidu.com/board?tab=realtime'headers={'User-Agent':'Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/116.0.0.0Safari/537.36&......
  • Python开发实例(十五)电子邮件自动化:编写一个程序,自动发送电子邮件或处理收件箱
    在这个实例中,我们将使用Python编写一个程序,实现自动发送电子邮件的功能。我们将使用Python的smtplib库来发送电子邮件。首先,请确保你已经安装了smtplib库。如果没有安装,可以通过以下命令来安装:pipinstallsecure-smtplib下面是一个自动发送电子邮件的Python程序:importsmtplibfro......
  • Python学习笔记-Python判断语句
    布尔类型和比较运算符布尔类型进行判断,只有2个结果:是否程序中,如何描述:是或否?使用:布尔类型。Python中常用的6种值(数据)的类型类型描述说明数字(Number)支持整数(int)浮点数(float)复数(complex)布尔(bool)整数(int),如10、-10浮点数(float),如13.14、-13.14复数(complex),如4+3j,以j结尾表示复数布尔(bool)......
  • 新人如何快速学会Python
    要快速学会Python,首先要了解Python的基本语法和数据类型。Python是一种解释型语言,具有简单易学、高效开发、库丰富等特点。首先,需要掌握Python的基本语法,例如变量、数据类型、控制流语句、函数等。可以通过阅读官方文档、在线教程、书籍等方式进行学习。同时,可以尝试编写简单的Pyt......
  • python学习笔记-celery介绍和使用
    一、celery介绍1、简介celery是分布式任务队列celery在执行任务时需要一个消息中间件来接收和发送消息,以及存储结果,一般使用rabbitmq,rediscelery的优先:简单:配置和使用比较简单高可用:当任务失败或执行过程中连接中断,celery会自动尝试重新执行快速:每分钟可处理上百万个任务灵活:几......
  • Python第四章序列(2):元组
    1.创建元组:  a=('a',2009) //与列表不同,用圆括号  a=()  a=(20,) //当元组中只包含一个元素的时候,需要在元素后加逗号,不然括号会被当成运算符2.元组访问:  a[1]   a[2:5] //也可以用切片  也可以用for的遍历。3.修改元组:  元组不允许......
  • Python第四章序列(1):列表
    1.列表的创建:  a=['hallo','guten',[2002,2223]]  empty_list=[]2.获得列表长度:  len(a)3.创建数值列表:  a=list(range(1,6))  //1到6的列表  b=list(range(1,11,2))  //1到10的奇数列表  c=list(random.sample((0,50),20)) //0到50的......