【问题标题】:how can I make this keypress simulator faster?我怎样才能让这个按键模拟器更快?
【发布时间】:2021-03-14 21:13:15
【问题描述】:

所以我从 pyautogui 库中获得了这段代码,但我并不完全理解它的实际作用。


    for apply_mod, vk_mod in [(mods & 4, 0x12), (mods & 2, 0x11),
        (mods & 1 or needsShift, 0x10)]: #HANKAKU not suported! mods & 8
        if apply_mod:
            ctypes.windll.user32.keybd_event(vk_mod, 0, 0, 0) #
    ctypes.windll.user32.keybd_event(vkCode, 0, 2, 0)
    for apply_mod, vk_mod in [(mods & 1 or needsShift, 0x10), (mods & 2, 0x11),
        (mods & 4, 0x12)]: #HANKAKU not suported! mods & 8
        print()
        if apply_mod:
            ctypes.windll.user32.keybd_event(vk_mod, 0, 2, 0)

所以假设我有一个不会改变或抛出错误的预期输入,我可以取出/重写什么以使其更快(目前非常慢)

【问题讨论】:

    标签: python-3.x performance boolean ctypes pyautogui


    【解决方案1】:

    我今天偶然发现了同样的代码,虽然我没有太多细节,但我或多或少地了解了它的作用。 您粘贴的这段代码对应于 keyUp 函数,如果您调用 presstypewrite,该函数也会在 keyDown 之后立即执行。 它检查需要正确键入修饰键的特殊字符。 在这段代码的正上方,有这样一行:

    mods, vkCode = divmod(keyboardMapping[key], 0x100)
    

    查看此变量mods。它接收收到的密钥除以0x100 的地板,即256。vkCode 得到余数。如果输入键有代码300,例如mods接收1,vkCode接收44。

    在第一个循环中,它检查 mods 并将其替换为 0x10、0x11 或 0x12,并调用 ctypes.windll.user32.keybd_event(vkCode, 0, 0, 0)。这个0是KEYDOWN。在此之后,它在循环之间释放 vkCode 键(因为它是 keyUp)。然后 for 循环再次检查 mods,这一次它释放修饰键,使用代码 2

    加快速度的一种方法是在找到mods 的结果后使用break 循环,但由于涉及needsShift,可能需要更多考虑(可能有2 个修饰键这段代码同时持有)。

    另一种方法是完全删除它,只在中间留下 keybd_event,如果你认为你甚至不需要使用它,但它当然仅供个人使用。此外,如果您打算无论如何更改它,请在与 keyDown 函数对应的 python 文件中查找类似的代码,以反映那里的更改。

    【讨论】:

      猜你喜欢
      • 2014-07-05
      • 2021-07-09
      • 2011-06-14
      • 2021-02-17
      • 1970-01-01
      • 2011-07-20
      • 1970-01-01
      • 2017-12-20
      • 1970-01-01
      相关资源
      最近更新 更多