## 认识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