【问题标题】:Difference between pynput key clicks and physical key clicks on the keyboard?pynput 键单击和键盘上的物理键单击之间的区别?
【发布时间】:2021-09-05 15:28:46
【问题描述】:

我最近意识到 Python 的 pynput 模块的按键点击没有在某些软件中注册。但是,物理键点击工作得很好。这就提出了如何识别这两种不同方法的问题。我以为这是很久以前的一个已回答的问题,但我似乎找不到任何关于此的帖子。

让我们以像 Genshin 这样的随机游戏为例。键盘上的“w”键会导致游戏中的角色向前移动。但是,诸如以下“按住”“w”键的程序不会被游戏注册。

from pynput.keyboard import Key, Controller

keyboard = Controller()

while True:
    keyboard.press("w")
    keyboard.release("w")

我的两个大问题是:

  1. 物理按键点击和程序生成按键点击让这些软件能够区分使用哪种方法有什么区别?
  2. 根据第一个问题的答案,有没有办法绕过这种差异而不用修改软件代码(也就是将程序生成的按键点击伪装成物理按键点击)?

提前致谢!

编辑:如果有人知道这是如何工作的,请告诉我。任何帮助将不胜感激!

【问题讨论】:

  • 也许如果你按住键不为零的时间,你实际上会看到一些向前的运动......
  • @jasonharper 即使按住它,它的工作原理也是一样的。我不认为关键点击首先被注册

标签: python pynput


【解决方案1】:

我在Genshin中尝试编写一个小程序帮助自己时也遇到了这个问题。经过一番苦苦搜索,我找到了这两个问题:question1question2

我不太确定它到底是如何工作的,所以我只能给你我的结论:当我们运行 Genshin 时,我们会赋予它管理员权限。没有管理员权限的程序无法与之交互。

要解决此问题,您可以将其合并到您的代码中:

import ctypes, sys

def is_admin():
    try:
        return ctypes.windll.shell32.IsUserAnAdmin()
    except:
        return False

if is_admin():
    # Code of your program here
else:
    # Re-run the program with admin rights
    ctypes.windll.shell32.ShellExecuteW(None, "runas", sys.executable, " ".join(sys.argv), None, 1)

然后您需要使用pyinstaller 模块使代码成为可执行文件。当您执行它时,它会重新运行并询问您的管理员权限,然后它可以在 Genshin 或其他程序上完成它的工作。

【讨论】:

  • 这是一个非常有趣的观点。自从我发布这个问题以来,我还没有找到解决这个问题的方法。稍后我会尝试一下,看看它是如何工作的。
【解决方案2】:

当然,有些游戏会故意阻止您尝试进行的那种作弊行为。他们如何做到这一点取决于操作系统。

例如,Windows 上的pynput 使用send_input API 将击键注入到输入系统中,但是一个有足够动力的应用程序可以在较低级别读取,通过使用键盘过滤器驱动程序在击键之前提取击键进入输入系统。

有了这样的设计,您在用户模式下就无法做任何事情来欺骗密钥。您需要自己的内核驱动程序,即便如此,保证过滤器加载的顺序也并非易事。

【讨论】:

    猜你喜欢
    • 2020-11-21
    • 1970-01-01
    • 1970-01-01
    • 2016-03-13
    • 2021-10-24
    • 1970-01-01
    • 1970-01-01
    • 2018-06-20
    • 2016-08-31
    相关资源
    最近更新 更多