PyNput 详细教程

PyNput 是一个 Python 库,用于控制和监控输入设备(键盘和鼠标)。它允许你监听输入事件(如按键和鼠标点击),也可以模拟输入操作。本教程将详细介绍 PyNput 的使用方法。

安装

pip install pynput

键盘控制

1. 监控键盘输入

from pynput import keyboard

def on_press(key):
    try:
        print(f'字母键 {key.char} 被按下')
    except AttributeError:
        print(f'特殊键 {key} 被按下')

def on_release(key):
    print(f'{key} 被释放')
    if key == keyboard.Key.esc:
        # 停止监听
        return False

# 监听键盘事件
with keyboard.Listener(on_press=on_press, on_release=on_release) as listener:
    listener.join()

2. 模拟键盘输入

from pynput.keyboard import Controller, Key

keyboard = Controller()

# 输入字符串
keyboard.type('Hello World!')

# 按下和释放特殊键
keyboard.press(Key.ctrl)
keyboard.press('c')
keyboard.release('c')
keyboard.release(Key.ctrl)

鼠标控制

1. 监控鼠标输入

from pynput import mouse

def on_move(x, y):
    print(f'鼠标移动到 ({x}, {y})')

def on_click(x, y, button, pressed):
    print(f'{button} 在 ({x}, {y}) {"按下" if pressed else "释放"}')
    if not pressed:
        # 停止监听
        return False

def on_scroll(x, y, dx, dy):
    print(f'在 ({x}, {y}) 滚动 {"下" if dy < 0 else "上"}')

# 监听鼠标事件
with mouse.Listener(on_move=on_move, on_click=on_click, on_scroll=on_scroll) as listener:
    listener.join()

2. 模拟鼠标操作

from pynput.mouse import Controller, Button

mouse = Controller()

# 获取当前鼠标位置
print(f'当前鼠标位置: {mouse.position}')

# 设置鼠标位置
mouse.position = (100, 200)

# 移动鼠标相对位置
mouse.move(50, -50)

# 点击鼠标
mouse.click(Button.left, 2)  # 双击左键

# 按下和释放鼠标按钮
mouse.press(Button.left)
mouse.release(Button.left)

# 滚动鼠标
mouse.scroll(0, 2)  # 向上滚动2个单位

高级用法

1. 组合键操作

from pynput.keyboard import Controller, Key

keyboard = Controller()

with keyboard.pressed(Key.ctrl):
    keyboard.press('a')
    keyboard.release('a')

2. 非阻塞监听

from pynput import keyboard

def on_press(key):
    print(f'{key} 被按下')

# 创建非阻塞监听器
listener = keyboard.Listener(on_press=on_press)
listener.start()

# 在这里可以执行其他代码
# ...

# 当需要停止监听时
listener.stop()

3. 热键监听

from pynput import keyboard

hotkey = keyboard.HotKey(
    keyboard.HotKey.parse('<ctrl>+<alt>+h'),
    lambda: print('热键被触发!'))

with keyboard.Listener(
        on_press=lambda key: hotkey.press(key),
        on_release=lambda key: hotkey.release(key)) as listener:
    listener.join()

注意事项

  1. 权限问题:在某些系统上,可能需要管理员权限才能监听或控制输入设备。
  2. 事件处理:在事件回调函数中执行耗时操作可能会影响性能。
  3. 多线程:监听器默认运行在单独的线程中。
  4. 跨平台:PyNput 支持 Windows、macOS 和 Linux,但某些功能在不同平台上可能有差异。

实际应用示例

1. 简单的屏幕截图工具

from pynput import keyboard, mouse
import pyautogui
import time

def on_click(x, y, button, pressed):
    if button == mouse.Button.left and pressed:
        print(f'截图已保存为 screenshot.png')
        pyautogui.screenshot('screenshot.png')
        return False  # 停止监听

# 按F8开始监听鼠标点击
def on_press(key):
    if key == keyboard.Key.f8:
        print('准备截图,请点击鼠标左键...')
        with mouse.Listener(on_click=on_click) as listener:
            listener.join()

with keyboard.Listener(on_press=on_press) as listener:
    listener.join()

2. 简单的自动点击器

from pynput.mouse import Controller, Button
from pynput.keyboard import Listener, Key
import time

mouse = Controller()
running = False

def on_press(key):
    global running
    if key == Key.f6:
        running = not running
        print(f'自动点击 {"开始" if running else "停止"}')
    elif key == Key.esc:
        return False  # 停止监听

# 键盘监听
listener = Listener(on_press=on_press)
listener.start()

# 自动点击循环
try:
    while True:
        if running:
            mouse.click(Button.left)
            time.sleep(0.5)  # 每0.5秒点击一次
        else:
            time.sleep(0.1)
except KeyboardInterrupt:
    listener.stop()

希望这个详细教程能帮助你掌握 PyNput 的使用!根据你的具体需求,可以组合使用这些功能来实现各种自动化任务。









results matching ""

    No results matching ""