python中的键盘鼠标操作及监听
在python中,提到键盘鼠标的操作模块,一定少不了PyAutoGUI,这个模块的跨平台统一API使得操作键盘鼠标变得简单
但是这个模块不支持键盘鼠标的监听,这就少了很多的功能,那么今天就推荐另一款鼠标键盘的操作模块:pynput
pynput模块不仅实现了跨平台的统一API操作键盘鼠标,还实现了键盘鼠标的监听
模块安装:pip install pynput
鼠标的操作和监听
鼠标操作
pynput包中的mouse包中包含常用的鼠标操作和监听的相关模块
from pynput.mouse import Button, Controller
# 引入pynput包中的鼠标相关类和常量
# 其中Button为鼠标按键的枚举
# Controller是一个鼠标操作的类
mouse = Controller()
# 创建鼠标操作实例对象
# 后续所有的鼠标操作都是基于该对象的属性和方法实现的
mouse.position
# 获取表示当前鼠标指针相对于主屏幕左上角坐标的2元元祖
mouse.position = (x,y)
# 设置该属性值即可将鼠标指针移动到指定坐标
mouse.move(x,y)
# 相对于鼠标当前位置移动指针
mouse.press(Button.left)
# 按下鼠标左键
mouse.release(Button.left)
# 松开鼠标左键
mouse.click(Button.left, 2)
# 点击鼠标左键2次,第二个参数表示点击的次数
# 可用的按键
# Button.left
# Button.middle
# Button.right
# Button.x1
# Button.x2
mouse.scroll(x, y)
# 滚动鼠标滚轮
# x,y表示滚动鼠标滚轮的长度,实际操作中滚轮的一个停顿即为1次
# x一般为0(一般鼠标的滚轮只支持上下滚动)
# y为整数表示向上滚动,为负表示向下滚动
鼠标监听
方式一、通过pynput.mouse.Listener类实现
from pynput import mouse
mouse.Listener(on_move=None, on_click=None, on_scroll=None)
# mouse.Listener类用于创建鼠标监听实例
# 创建对象时设置鼠标监听的各种操作的回调函数
# 各个回调函数的接收参数
# 所有回调函数均是使用threading.Thread在新的线程中运行
# on_move(x,y):接受鼠标移动事件发生后的坐标
# on_click(x, y, button, pressed):接受鼠标按键按下和松开事件发生时的信息
x,y表示事件发生时的鼠标指针坐标
button表示按下的鼠标按键
pressed是一个bool值,表示鼠标按键当前是否处于按下状态
# on_scroll(x, y, dx, dy):接受鼠标滚轮事件发生时的信息
x,y表示事件发生时的鼠标指针坐标
dx, dy表示鼠标的滚轮滚动方向及次数
listener.join():阻塞的监听鼠标事件,一般用于with语句
listener.start():非阻塞的监听鼠标事件,当主线程结束时程序会终止,监听也就会失效
listener.stop():停止监听,在任何位置运行该函数均会停止监听
# 任意一个回调函数一旦返回False,会停止监听,和运行listener.stop()结果相同
# 一旦停止监听,那么该监听器实例不能再使用了,因为监听器是一个threading.Thread,一旦停止它无法重新启动
from pynput import mouse
def on_move(x, y):
print(f"鼠标移动到了: {x},{y}")
def on_click(x, y, button, pressed):
print(f"鼠标 { button } 键在坐标 {x:04d},{y:04d} 位置点击了,当前状态 {'下压' if pressed else '松开'}")
def on_scroll(x, y, dx, dy):
print(f"鼠标滚轮在坐标 {x:04d},{y:04d} 位置向{'下' if dy<0 else '上'}滚动了{dy if dy>0 else -dy}下")
with mouse.Listener(on_move=on_move, on_click=on_click, on_scroll=on_scroll) as listener:
listener.join()
方式二、通过pynput.mouse.Events类实现
通过with语句创建Events实例对象
Events实例对象可以通过for循环(无限循环)接受事件
with mouse.Events() as events:
for event in events:
if event.button == mouse.Button.right:
break
# 设置退出循环的按键
else:
print(f'当前按键 {event}')
也可以通过get(timeout)方法阻塞的在指定时间内接受一个事件,如果超时返回None
with mouse.Events() as events:
event = events.get(5.5)
# 设置超时时间为5.5秒
if event is None:
print('在5.5秒内未接受到鼠标事件')
else:
print(f'发生鼠标事件 {event}')
键盘的操作和监听
键盘操作
pynput包中的keyboard包中包含常用的键盘操作和监听的相关模块
from pynput.keyboard import Key, Controller
# 引入pynput包中的键盘相关类和常量
# 其中Key为键盘按键的枚举,主要用于功能键
# Controller是一个键盘操作的类
keyboard = Controller()
# 创建键盘操作的实例对象
# 后续所有的键盘操作都是基于该对象的属性和方法实现的
keyboard.press(key):按下某个按键
keyboard.release(key):松开某个按键
keyboard.tap(key):按下并松开(点击)某个按键
keyboard.touch(key,id_pressed):指定一个按键的按压状态
# 常用的功能键
Key.f1-f12
Key.alt、Key.alt_l、Key.alt_r、Key.alt_gr
Key.ctrl、Key.ctrl_l、Key.ctrl_r
Key.shift、Key.shift_r
Key.up、Key.down、Key.left、Key.right、Key.end、Key.home
Key.cmd、Key.cmd_r
Key.num_lock、Key.caps_lock、Key.scroll_lock
Key.backspace、Key.delete
Key.enter、Key.space、Key.tab、Key.esc
Key.insert、Key.pause、Key.menu、Key.print_screen
Key.media_play_pause、Key.media_volume_mute、
Key.media_volume_down、Key.media_volume_up、
Key.media_previous、Key.media_next
# 其他字母,数字,符号等直接输入对应字符串,支持中文字符
# 只能输入一个字符,多个字符会报错
keyboard.press('A')
keyboard.press('牛')
# 组合按键
# 方式一、使用多次keyboard.press()方法可以实现组合按键,但是功能按键需要手动释放(松开),否则即使程序退出,功能按键仍然保持按下状态
keyboard.press(Key.shift)
keyboard.press('a')
# 运行后会输出一个大写的A,但是当程序结束后shift仍然是处于按下状态
# 我们手动输入字母的时候仍然会出入大写字母,需要手动按一下shift然后松开才能解除该状态
# 方式二、使用函数保持某些功能键的组合
pressed(key)
# 使用with语句
with keyboard.pressed(Key.shift):
keyboard.press('a')
keyboard.release('a')
# 输入字符串
type(str):直接输入指定的字符串
# 判断当前常用的功能键是否处于按下状态
# 并非监听键盘,仅获取当前程序中指定的功能键是否按下
alt_gr_pressed, alt_pressed, ctrl_pressed, shift_pressed
键盘监听
键盘监听和方式类似于鼠标监听
方式一、通过pynput.keyboard.Listener类实现
from pynput import keyboard
keyboard.Listener(on_press=None, on_release=None)
# 回调函数均接受一个key参数,表示按下或松开事件的按键
listener.join()、listener.start()、listener.stop()的使用方法和鼠标监听相同
with keyboard.Listener(on_press=on_press, on_release=on_release) as listener:
listener.join()
方式二、通过pynput.keyboard.Events类实现
通过with语句创建Events实例对象
Events实例对象可以通过for循环(无限循环)接受事件
with keyboard.Events() as events:
for event in events:
if event.key == keyboard.Key.esc:
break
# 设置退出循环的按键
else:
print(f'当前按键 {event}')
也可以通过get(timeout)方法阻塞的在指定时间内接受一个事件,如果超时返回None
with keyboard.Events() as events:
event = events.get(5.5)
# 设置超时时间为5.5秒
if event is None:
print('在5.5秒内未接受到键盘事件')
else:
print(f'发生键盘事件 {event}')
键盘的全局热键监听
热键主要是多个按键组合,用于开关某个功能
使用pynput.keyboard.GlobalHotKeys类来注册若干个全局热键并实现全局热键的监听
通过with语句创建实例对象
def on_one():
print('ctrl + alt + h 组合按键触发')
def on_two():
print('alt + p 组合按键触发')
def on_exit():
print('ctrl + shift + d 退出监听触发')
h.stop()
# 分别编写各个热键触组合发时的程序逻辑
with keyboard.GlobalHotKeys(
{
"<ctrl>+<alt>+h": on_one,
"<alt>+p": on_two,
"<ctrl>+<shift>+d": on_exit,
}
) as h:
h.join()
创建GlobalHotKeys类实例对象是传入的对象中键为按键组合,值为要执行的函数
按键组合为字符串格式,功能键使用中括号(<>)包含