【问题标题】:How can I send keystrokes and mouse movement to a specific PID?如何将击键和鼠标移动发送到特定的 PID?
【发布时间】:2022-02-01 21:00:33
【问题描述】:

如何通过其 PID 将击键和鼠标移动发送到特定正在运行的程序。我已经使用了 pywinauto 和 pynput,它们工作得很好,但是我想将密钥发送到一个没有焦点的程序。我发现了这个问题:How to I send keystroke to Linux process in Python by PID?,但它从未解释过filePath 是什么路径。

如果你能帮助解决这个例子,那就太好了!我想将“d”键发送到打开的 Minecraft 选项卡 10 秒,然后在接下来的 10 秒内发送“a”键并停止。我需要它能够在后台运行,因此它不能将密钥作为一个整体发送到计算机,而只能发送到 Minecraft 选项卡。顺便说一句,我使用的是 Windows 10。

任何帮助将不胜感激!

【问题讨论】:

  • 只是为了上下文,为什么要将击键和鼠标移动发送到未聚焦的窗口?我只是想更好地了解您的用例。
  • @ShaneBishop 以 Minecraft 为例,我想让我的角色向前跑 20 分钟或类似的时间,但我想同时在我的电脑上做其他事情。我也可能想让我的角色每 10 分钟转 90 度,所以我也需要鼠标移动
  • 我觉得这个问题对于 Stack Overflow 来说可能过于宽泛。也许您可以将您的问题改写为更具体的内容,例如“如何使用 Python 模拟特定 Windows 进程的向上箭头按住 x 分钟?”

标签: python python-3.x windows pid keystroke


【解决方案1】:

很确定你不能,至少不能轻易让我解释一下这一切是如何工作的。

让我们从硬件和操作系统开始,操作系统具有某些功能来读取您给计算机的输入。此输入进入“管道”,操作系统正在读取输入,并将其放入管道,在管道的另一侧可能有一个应用程序正在运行,也可能没有。操作系统通常通过定义哪个应用程序/窗口处于活动状态来管理这个(哪个应用程序放在管道监听上)。应用程序使用操作系统提供的 API 访问此管道,它们读取输入并做出决定。

您上面引用的库更改了键盘和鼠标的值,换句话说,它们使操作系统读取其他值,而不是真实值,然后操作系统将它们放入“管道”中,并由正在侦听管道的应用程序(活动的应用程序)。有些应用程序有自己的 API,但我猜 Minecraft 没有。如果他们没有 API,你能做什么?好吧,正如我所说,这并不容易,首先“破解”应用程序,换句话说,将其更改为监听其他输入/输出,而不是操作系统提供的输入/输出,(这将是您制作自己的 API) .另一个是您更改操作系统,这也将非常困难,但可能会容易一些。这也取决于你的操作系统,我认为微软确实提供了输入注入 api 的

所以,简单的选择,首先,运行一个带有 GUI 的虚拟机并使用 pywinauto、pyautogui 等。另一个选择是如果你可以在浏览器中运行它,这样做,并使用 Selenium 之类的东西来自动化输入.

快速说明,为什么 selenium 可以工作并且浏览器可以在后台读取输入?很简单,它不是,它只是执行如果它会读取输入就会执行的代码! javascript,不是很酷

【讨论】:

    【解决方案2】:

    使用ahk,您可以使用 Python+AutoHotkey 完成此操作

    pip install ahk
    pip install "ahk[binary]"
    
    from ahk import AHK
    from ahk.window import Window
    ahk = AHK()
    win = Window.from_pid(ahk, pid='20366')
    win.send('abc') # send keys directly to the window
    

    请注意,某些程序可能会在输入未聚焦时简单地忽略它们。但是,您可以通过使用notepad 之类的程序进行测试,即使在不关注焦点的情况下也可以测试此功能。

    完全披露:我作者the ahk library

    【讨论】:

    • 哇!这个图书馆太棒了!!快速提问,如何在运行其他键的同时按住鼠标按钮?
    • @TimmyDiehl 一个典型的鼠标点击有两个事件:“DOWN”和“UP”。您可以通过传递direction 关键字参数,使用click 方法独立发送这些事件。例如,按住鼠标,输入内容,然后松开鼠标:ahk.click(direction='down');ahk.type('some words');ahk.click(direction='up')
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-11
    • 2020-12-18
    • 2011-07-19
    • 1970-01-01
    • 2011-06-12
    • 2020-02-08
    相关资源
    最近更新 更多