答案1
我猜想与 Sandboxie 中运行的应用程序交互的唯一方式是通过应用程序提供的窗口界面。如果 SandBoxie 以不同的用户身份运行程序,则任何类型的直接界面都可能被 SandBoxie 抽象化,以防止其直接访问文件系统和其他用户进程(因为我没有它,所以不太清楚它是如何工作的,只是猜测)。
如果您不知道要使用哪个窗口(即将击键发送到哪个窗口),请尝试Window Spy
AutoHotkey 附带的应用程序。
不幸的是,使用 时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 内部的程序一起工作。