如何仅在 PID 可用的情况下在后台运行 autohotkey 脚本?

如何仅在 PID 可用的情况下在后台运行 autohotkey 脚本?

我喜欢在虚拟机 (sandboxie) 的后台运行 autohotkey 脚本。该脚本将无限循环按下 f1-f8 键。它应该也会对在虚拟机上运行的游戏产生影响。

我很确定我需要使用ControlSend,所以它看起来像这样

ControlSend, , {f1}, HERE_COMES_THE_WINDOW_NAME

但由于某种原因,我不能使用窗口名称,所以我喜欢使用 PID 来代替它。

这可能吗?如果可以,怎么做?

虚拟机看起来像这样(Game.exe 是我喜欢运行 Autohotkey 脚本的游戏):

在此处输入图片描述

答案1

我猜想与 Sandboxie 中运行的应用程序交互的唯一方式是通过应用程序提供的窗口界面。如果 SandBoxie 以不同的用户身份运行程序,则任何类型的直接界面都可能被 SandBoxie 抽象化,以防止其直接访问文件系统和其他用户进程(因为我没有它,所以不太清楚它是如何工作的,只是猜测)。

如果您不知道要使用哪个窗口(即将击键发送到哪个窗口),请尝试Window SpyAutoHotkey 附带的应用程序。

不幸的是,使用 时ControlSend,事情并不总是像您期望的那样工作。您可能还想尝试ahk_parent的选项ControlSend

一般来说,尝试检测并随后使用窗口句柄(HWND)而不是类似的东西可能更可靠ahk_exe game.exe——即,您不必担心窗口句柄被解释为窗口句柄以外的任何东西,并且您可以 100%确认您有正确的窗口句柄。

另一个用于检测多层窗口的有用工具是 Microsoft Spy++,以便您可以尝试发送不同的控件和/或 HWND 值,它将向您显示窗口的层次结构和控件名称。如果父窗口不起作用,这可能会让您找到要发送到的正确控件值。同样,这实际上只在您尝试将ControlSend某些内容发送到非活动窗口时才有用——如果您只是用它SendInput来将某些内容发送到活动窗口,那么Spy++它不会告诉您任何有用的信息。

回到最初关于通过 PID 访问进程的问题,这里唯一的价值是潜在地保证您拥有链接到特定 PID 的正确窗口句柄(但您仍会向窗口发送某些内容,因此这只是获取窗口的间接方法)。为此,您可以使用下面的代码。

代码摘录自:如何暂停外部进程

DetectHiddenWindows, ON ; You should avoid this for your purpose!!
PID := DllCall("GetCurrentProcessId")

Gui, 1:Show, x0 y0   w200 h100, Test Window1
Gui, 2:Show, x205 y0 w200 h100, Test Window2

WinGet, List, List, ahk_pid %PID%

Loop %List%
{
WinGetTitle, Title, % "ahk_id " List%A_Index%
Wins .= Title "`n"
}

MsgBox, 0, Windows for PID: %PID%,  %Wins%

ExitApp

回到最初的问题:

由于某种原因我无法使用窗口名称

您没有确切说明是什么症状让您相信这一点,但我猜测可能是“它只是不起作用”之类的。

如果是这种情况,我还建议尽可能简化问题,并使用可以明确测试的程序使其工作。例如,notepad在 Sandboxie 中运行并发送它Alt+F4以将其杀死,或类似操作。或者让一些基本程序在 Sandboxie 之外工作,然后尝试让它在 Sandboxie 内部工作,以确保 Sandboxie 本身与脚本中断无关。如果脚本从一开始就被破坏,并且无法在 Sandboxie 之外工作,那么它也无法与 Sandboxie 内部的程序一起工作。

相关内容