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

pyautogui如何通过按键值而非按键名模拟按键操作?

问题原因

pyautogui 没有提供直接传入键值模拟按键的开放接口,你遇到的键值不匹配问题本质是:

  • Scroll Lock单独按下时对应的虚拟键码为十进制17(十六进制0x91),这也是pyautogui内部写死的scrolllock按键对应的固定映射值
  • 右Ctrl属于键盘扩展键,按下右Ctrl时再按Scroll Lock,系统会识别到带扩展修饰符的按键序列,对应键值为3,pyautogui发送按键时没有给右Ctrl添加扩展键标记,也不会根据当前按下的修饰键动态调整发送的Scroll Lock键值,所以你之前写的两种代码都只能发送键值17,无法触发目标快捷键。
实现方案

不用依赖pyautogui的按键名映射,直接通过Python内置的ctypes库调用Windows底层user32.dll的keybd_event接口即可,既可以手动控制扩展键标记,也支持直接传入任意自定义键值发送。

可直接运行的代码

import ctypes

user32 = ctypes.WinDLL("user32", use_last_error=True)
# 按键事件标记常量
KEYEVENTF_KEYUP = 0x0002
KEYEVENTF_EXTENDEDKEY = 0x0001
# 虚拟键码定义
VK_RCTRL = 0xA3  # 右Ctrl虚拟键码
VK_SCROLL = 0x91 # Scroll Lock基础虚拟键码(对应十进制17)

def send_key(vk_code, key_up=False, extended_key=False):
    event_flag = 0
    if key_up:
        event_flag |= KEYEVENTF_KEYUP
    if extended_key:
        event_flag |= KEYEVENTF_EXTENDEDKEY
    user32.keybd_event(vk_code, 0, event_flag, 0)

if __name__ == "__main__":
    # 按下右Ctrl,标记为扩展键
    send_key(VK_RCTRL, extended_key=True)
    # 第一次按下并抬起Scroll Lock
    send_key(VK_SCROLL)
    send_key(VK_SCROLL, key_up=True)
    # 第二次按下并抬起Scroll Lock
    send_key(VK_SCROLL)
    send_key(VK_SCROLL, key_up=True)
    # 抬起右Ctrl
    send_key(VK_RCTRL, key_up=True, extended_key=True)

自定义键值发送说明

如果你需要直接发送你测到的键值3,只需要把代码中调用send_key时传入的VK_SCROLL替换为3即可,keybd_event接口支持直接传入任意数值的虚拟键码,不需要和pyautogui预定义的按键名做映射。

注意:该快捷键触发系统崩溃需要提前在系统设置中开启对应功能,否则按键序列不会生效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 11:09:23