【问题标题】:why does simulating keypresses not work for alt+tab and ctrl+alt+del?为什么模拟按键对 alt+tab 和 ctrl+alt+del 不起作用?
【发布时间】:2016-09-25 04:57:21
【问题描述】:

所以我想尝试模拟一些按键,我使用了这里找到的脚本:

Python simulate keydown

Generate keyboard events

当我运行这些脚本时,虽然按钮被按下,但它不会在 windows 8 上显示更改窗口的东西或 ctrl alt del 菜单。但是,在 windows 7 计算机上,alt 选项卡确实有效。为什么它在 Windows 8 上不起作用?有没有办法可以模拟这些笔画?

【问题讨论】:

  • 使用pyautogui 模块。这是键盘鼠标操作的最佳选择。您可以轻松找到教程。
  • @GLHF pyautogui 仍然不模拟 alt tab 或 ctrl alt delete。按钮被按下,但它没有调用窗口的特殊功能。
  • 确实如此。它使用键盘+鼠标完成所有操作。 pyautogui 中有一些用于按住按钮的功能。它确实有效。
  • @GLHF 你确定吗?你可以发布它的代码吗?因为当我在 pyautogui 中使用 keydown 来尝试模拟 alt tab 或 ctrl alt del 时,它会失败。按下并按住按钮,但它不会为这些绑定执行窗口的特殊功能。

标签: python keyboard


【解决方案1】:
import ctypes,time

KEYEVENTF_UNICODE = 0x0004
KEYEVENTF_KEYUP = 0x0002

def PressKey(KeyUnicode):

    extra = ctypes.c_ulong(0)
    ii_ = Input_I()
    ii_.ki = KeyBdInput( 0, KeyUnicode, KEYEVENTF_UNICODE, 0, ctypes.pointer(extra) )
    x = Input( ctypes.c_ulong(1), ii_ )
    ctypes.windll.user32.SendInput(1, ctypes.pointer(x), ctypes.sizeof(x))

def ReleaseKey(KeyUnicode):

    extra = ctypes.c_ulong(0)
    ii_ = Input_I()
    ii_.ki = KeyBdInput( 0, KeyUnicode, KEYEVENTF_UNICODE|KEYEVENTF_KEYUP, 0, ctypes.pointer(extra) )
    x = Input( ctypes.c_ulong(1), ii_ )
    ctypes.windll.user32.SendInput(1, ctypes.pointer(x), ctypes.sizeof(x))


def PressAltTab():

    ctypes.windll.user32.keybd_event(0x12, 0, 0, 0) #Alt
    ctypes.windll.user32.keybd_event(0x09, 0, 0, 0) #Tab

    time.sleep(2) #optional : if you want to see the atl-tab overlay

    ctypes.windll.user32.keybd_event(0x09, 0, 0x0002, 0) #~Tab
    ctypes.windll.user32.keybd_event(0x12, 0, 0x0002, 0) #~Alt

PressAltTab()

这适用于ALT+TAB,在PressAltTab() 你看到ctypes.windll.user32.keybd_event(0x12, 0, 0, 0),只需找到ctrldelete 的正确数字。如你所见alt0x12

但是,ctrl+alt+del 是一个特殊的快捷键,可能有安全原因阻止它假按。至少这是我在论坛上看到的。

【讨论】:

    猜你喜欢
    • 2011-06-30
    • 1970-01-01
    • 2014-09-12
    • 2016-02-17
    • 2023-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多