目录
前言
首先放上官网链接
示例代码
模拟输入
监控输入
按键与鼠标宏
测试时的问题:按键按下不弹起的bug
前言
键盘输入我们第一时间会想到win32api,这货还行,就是稍微繁琐了点,底层了点
Windows平台Python编程必会模块之pywin32_顺其自然~的博客-CSDN博客_python pywin32
如果想监听键盘,网上大量的文章都是pyHook,但是这货是为python2服务的,然后python3要用就得经过复杂的途径,所以监听键盘用这个很难搞。
终于,我发现了pynput库,简直是救星!
对于键盘输入,pynput非常简洁,并且提供了组合键的简洁写法
对于键盘监听,pynput也非常简洁,关键是pynput一个库就实现了我们要的所有功能!
安装就pip即可,不会真有人搜到这里还不会用pip吧。
好,进入学习
首先放上官网链接
官网pynput Package Documentation — pynput 1.7.6 documentation
关于键盘Handling the keyboard — pynput 1.7.6 documentation
示例代码
模拟输入
from pynput import keyboard,mousefrom pynput.keyboard import Keyfrom pynput.mouse import Button# 键盘# 生成了一个控制器类key_ctrl = keyboard.Controller()# 简单按下放松key_ctrl.press('a')key_ctrl.release('a')# 组合键写法1,顺序press,倒序release,比较麻烦key_ctrl.press(Key.shift)key_ctrl.press('a')key_ctrl.release(Key.shift)key_ctrl.release('a')# 组合键写法2,使用with,自动释放,代码量缩小一半with key_ctrl.pressed(Key.shift):key_ctrl.press('a')key_ctrl.release('a')# 整段文字输入key_ctrl.type('text')# 鼠标mouse_ctrl=mouse.Controller()mouse_ctrl.scroll(0,-1) # 左右,上下,-1是往下滚,有小伙伴好奇,怎么能左右滚呢?#当然是shift滚轮啦print(mouse_ctrl.position)mouse_ctrl.position=(0,0) # 绝对移动,直接设置坐标mouse_ctrl.move(80,10) # 相对移动,通过函数实现mouse_ctrl.click(Button.left,1) #选择键和次数mouse_ctrl.press(Button.left) # 按下与释放,选择键mouse_ctrl.release(Button.left)
监控输入
from pynput import keyboardfrom pynput import mousedef on_press(key):"""定义按下时候的响应,参数传入key"""try:print(f'{key.char} down')except AttributeError:print(f'{key} down')def on_release(key):"""定义释放时候的响应"""print(f'{key} up')def on_move(x,y):print('move to',x,y)def on_click(x,y,button,pressed):print('click at',x,y,button,pressed)def on_scroll(x,y,dx,dy):print('scroll at',x,y,'by',dx,dy)# 监听写法1def listen_key_block():with keyboard.Listener(on_press=on_press, on_release=on_release) as listener:listener.join() # 加入线程池,阻塞写法# 监听写法2def listen_key_nblock():listener = keyboard.Listener(on_press=on_press, on_release=on_release)listener.start() # 启动线程def listen_mouse_nblock():listener = mouse.Listener(on_move=None, # 因为on_move太多输出了,就不放进来了,有兴趣可以加入on_click=on_click,on_scroll=on_scroll)listener.start()if __name__ == '__main__':listen_mouse_nblock()listen_key_nblock()while True: # 这里应该用一个循环维持主线程,否则主线程结束了子线程就自动结束了pass
按键与鼠标宏
# 注意,按键类型有两种,一种是'pynput.keyboard._win32.KeyCode',另一种就是下面的枚举类
# 注意按键的模块是这个,'pynput.keyboard.Key',下面举出部分枚举,实际上还有更多_MODIFIER_KEYS = ((Key.alt_gr, (Key.alt_gr.value,)),(Key.alt, (Key.alt.value, Key.alt_l.value, Key.alt_r.value)),(Key.cmd, (Key.cmd.value, Key.cmd_l.value, Key.cmd_r.value)),(Key.ctrl, (Key.ctrl.value, Key.ctrl_l.value, Key.ctrl_r.value)),(Key.shift, (Key.shift.value, Key.shift_l.value, Key.shift_r.value)))
测试时的问题:按键按下不弹起的bug
【Python】win32api调用后ctrl键弹不起,无法释放的原因_亦梦亦醒乐逍遥的博客-CSDN博客