【Python】监听键盘鼠标,基于pynput库

目录

前言

首先放上官网链接

示例代码

模拟输入

监控输入

按键与鼠标宏

测试时的问题:按键按下不弹起的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)))

测试时的问题:按键按下不弹起的bug

【Python】win32api调用后ctrl键弹不起,无法释放的原因_亦梦亦醒乐逍遥的博客-CSDN博客

你可能感兴趣的:(python技巧,python,开发语言,后端)