目录
前言
首先放上官网链接
示例代码
模拟输入
监控输入
按键与鼠标宏
测试时的问题:按键按下不弹起的bug
键盘输入我们第一时间会想到win32api,这货还行,就是稍微繁琐了点,底层了点
如果想监听键盘,网上大量的文章都是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,mouse
from pynput.keyboard import Key
from 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 keyboard
from pynput import mouse
def 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)
# 监听写法1
def listen_key_block():
with keyboard.Listener(
on_press=on_press, on_release=on_release) as listener:
listener.join() # 加入线程池,阻塞写法
# 监听写法2
def 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)))
【Python】win32api调用后ctrl键弹不起,无法释放的原因_亦梦亦醒乐逍遥的博客-CSDN博客