ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
## 认识pyWinhook 关于键盘监听相关的库,网上的朋友一般会向大家推荐`pyHook`——pyHook是一个用来进行键盘、鼠标等层面事件监控的库。这个库的正常工作需要pythoncom等操作系统的API的支持。但是,pyHook很早停止了更新,我们可以使用`pyWinhook`来代替`pyHook`。使用`pyWinhook`后,你会发现,`pyWinhook`可以兼容大部分的`pyHook`代码。 ### 安装pyWinhook ``` pip install pywinhook ``` ### 键盘监听案例 下面这个案例,用来监听键盘按钮的按下与释放两种事件(不能识别组合键)。 ``` import pyWinhook as pyHook import pythoncom # 记录按键按下、释放 class KeyBoardManager(): keyIsPressed = False def onKeyDown(self,event): if self.keyIsPressed: return True print(str(event.Key) + ' is pressed') self.keyIsPressed = True return True def onKeyUp(self,event): self.keyIsPressed = False print(str(event.Key) + ' is released') return True if __name__ == '__main__': mykbmanager = KeyBoardManager() hookmanager = pyHook.HookManager() hookmanager.KeyDown = mykbmanager.onKeyDown hookmanager.KeyUp = mykbmanager.onKeyUp hookmanager.HookKeyboard() pythoncom.PumpMessages() ``` 我们的目的是,通过这个类能够修改其他类中的数据。所以,需要把这个类改造成一个可以被其他模块引用的类: ``` import pyWinhook as pyHook import pythoncom # 记录按键按下、释放 class KeyBoardManager: keyIsPressed = False def __init__(self, task): self.task = task def onKeyDown(self,event): if self.keyIsPressed: return True print(str(event.Key) + ' is pressed') self.keyIsPressed = True return True def onKeyUp(self,event): self.keyIsPressed = False print(str(event.Key) + ' is released') return True def listen(self): hookmanager = pyHook.HookManager() hookmanager.KeyDown = self.onKeyDown hookmanager.KeyUp = self.onKeyUp hookmanager.HookKeyboard() pythoncom.PumpMessages() if __name__ == '__main__': mykbmanager = KeyBoardManager() mykbmanager.listen() ``` ## 异步函数调用 在实现异步调用之前我们先进行什么是同步调用和异步调用 * 同步:是指完成事务的逻辑,先执行第一个事务,如果阻塞了,会一直等待,直到这个事务完成,再执行第二个事务,顺序执行 * 异步:是和同步相对的,异步是指在处理调用这个事务的之后,不会等待这个事务的处理结果,直接处理第二个事务去了,通过状态、通知、回调来通知调用者处理结果 分析一下,下面的例子:  ``` 定义了一个装饰器 async 和 A 、B 两个function 函数 A 里面sleep 10s , 然后打印 a function 字符串  B 里面直接打印 b function 字符串  我们顺序调用两个功能:  A()  B( )  ``` 由于函数A在睡的状态,我们又不希望程序被阻塞在函数A的睡的状态,所以我们采用异步执行,即在函数A睡的状态,让其他的任务执行 ~~~ from threading import Thread from time import sleep def lasync(f): def wrapper(*args, **kwargs): thr = Thread(target=f, args=args, kwargs=kwargs) thr.start() return wrapper @lasync def A(): sleep(10) print("函数A睡了十秒钟。。。。。。") print("a function") def B(): print("b function") A() B() ~~~ 执行结果: ~~~ #b function #函数A睡了十秒钟。。。。。。 #a function ~~~ ## 相关资料 pyHook相关文档:https://sourceforge.net/p/pyhook/wiki/PyHook_Tutorial/#keyboard-hooks