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_
相关产品推荐
相关产品推荐

