如何僅在 PID 可用的情況下在背景執行 autohotkey 腳本?

如何僅在 PID 可用的情況下在背景執行 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 是另一個用於偵測多層視窗的有用工具,以便您可以嘗試傳送不同的控制項和/或 HWND 值,Spy++它將向您顯示視窗的層次結構和控制項名稱。如果父視窗不起作用,這可以讓您找到要傳送到的正確控制項值。再說一遍,只有當您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 內部的程式一起運行。

相關內容