You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python模拟持续按键失效:为何仅触发单次按键?

Python模拟持续按键失效问题(Windows 10 + Azerty键盘)

问题描述

  • 开发简易宏软件,文本输入功能正常,但模拟持续按键(如按住'a'键1秒)仅触发单次输入,无法实现持续按压效果
  • 运行环境:Windows 10、Python 3.10.5、Azerty键盘
  • 已尝试pynput、pyautogui、keyboard等多个Python库,以管理员身份运行程序及生成的.exe文件,在记事本、Word、Chrome等软件测试均无效,测试代码输出为aaaqaaaa
  • 当前临时方案为循环每隔x毫秒触发一次按键,寻求根本解决方法

解决方案

1. 适配Azerty键盘的按键映射

Azerty键盘的虚拟键码与Qwerty布局不同,直接使用Qwerty的虚拟键码(如0x41对应'A')会导致映射错误(测试输出中的'q'就是因为Azerty布局下0x41对应'Q')。需通过系统API获取正确的按键映射:

import ctypes
import time

user32 = ctypes.WinDLL('user32', use_last_error=True)
# 获取Azerty布局下字符'a'对应的虚拟键码
vk_code = user32.VkKeyScanW(ord('a')) & 0xFF
# 转换为扫描码
scan_code = user32.MapVirtualKeyW(vk_code, 0)
# 按下按键(使用扫描码确保布局适配)
user32.keybd_event(vk_code, scan_code, 0, 0)
time.sleep(1)
# 释放按键
user32.keybd_event(vk_code, scan_code, 0x0002, 0)

2. 配置pydirectinput的键盘布局

pydirectinput默认采用Qwerty布局,需手动指定为Azerty:

import pydirectinput
import time

pydirectinput.keyboardLayout = 'azerty'
pydirectinput.keyDown('a')
time.sleep(1)
pydirectinput.keyUp('a')

3. 模拟系统按键重复机制

Windows的持续按键依赖系统的重复延迟和重复率设置(可在控制面板-键盘中调整),部分库的模拟未触发该机制,可手动模拟贴近系统的重复行为:

import time
from pynput.keyboard import Controller

keyboard = Controller()
keyboard.press('a')
# 模拟系统默认重复延迟(约500ms)
time.sleep(0.5)
start_time = time.time()
# 按系统重复率(示例为每秒30次)发送按键
while time.time() - start_time < 1:
    keyboard.press('a')
    keyboard.release('a')
    time.sleep(1/30)
keyboard.release('a')

4. 规避软件输入拦截

部分软件(如Chrome、游戏)会拦截模拟输入,可尝试:

  • 使用pydirectinput(专为游戏输入优化)
  • 以管理员权限运行程序
  • 临时关闭杀毒软件的输入保护功能

测试代码(修正缩进后)

import time
import ctypes
import keyboard
import pyautogui
import pydirectinput
import win32api
import autoit
from pywinauto.keyboard import send_keys
from pynput.keyboard import Key, Controller as PynputController

def press_key_pynput():
    pynput_keyboard = PynputController()
    pynput_keyboard.press('a')
    time.sleep(1)
    pynput_keyboard.release('a')

def press_key_pyautogui():
    pyautogui.keyDown('a')
    time.sleep(1)
    pyautogui.keyUp('a')

def press_key_keyboard():
    keyboard.press('a')
    time.sleep(1)
    keyboard.release('a')

def press_key_pydirectinput():
    pydirectinput.keyDown('a')
    time.sleep(1)
    pydirectinput.keyUp('a')

def press_key_ctypes():
    user32 = ctypes.WinDLL('user32', use_last_error=True)
    VK_A = 0x41
    user32.keybd_event(VK_A, 0, 0, 0)
    time.sleep(1)
    user32.keybd_event(VK_A, 0, 2, 0)

def press_key_win32api():
    VK_A = 0x41
    win32api.keybd_event(VK_A, 0, 0, 0)
    time.sleep(1)
    win32api.keybd_event(VK_A, 0, 2, 0)

def press_key_autoit():
    autoit.send("{a down}")
    time.sleep(1)
    autoit.send("{a up}")

def press_key_pywinauto():
    send_keys('a')
    time.sleep(1)

def simulate_key_press():
    time.sleep(2)
    press_key_pynput()
    time.sleep(1)
    press_key_pyautogui()
    time.sleep(1)
    press_key_keyboard()
    time.sleep(1)
    press_key_pydirectinput()
    time.sleep(1)
    press_key_ctypes()
    time.sleep(1)
    press_key_win32api()
    time.sleep(1)
    press_key_autoit()
    time.sleep(1)
    press_key_pywinauto()

simulate_key_press()

内容的提问来源于stack exchange,提问作者None

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 15:08:17