Как можно запустить скрипт autohotkey в фоновом режиме только при наличии PID?

Как можно запустить скрипт autohotkey в фоновом режиме только при наличии PID?

Мне нравится запускать скрипт autohotkey в фоновом режиме внутри виртуальной машины (sandboxie). Скрипт будет нажимать клавиши f1-f8 в бесконечном цикле. Предполагается, что он также будет влиять на игру, которая работает на виртуальной машине.

Я почти уверен, что мне нужно использовать ControlSend, поэтому это будет выглядеть так

ControlSend, , {f1}, HERE_COMES_THE_WINDOW_NAME

но по какой-то причине я не могу использовать имя окна, поэтому предпочитаю использовать вместо него PID.

Возможно ли это сделать и если да, то как?

Виртуальная машина выглядит так (Game.exe — это игра, в которой я люблю запускать скрипт Autohotkey):

введите описание изображения здесь

решение1

Я предполагаю, что единственный способ взаимодействия с приложением, запущенным в Sandboxie, — это через интерфейс окна, который предоставляет приложение. Любой прямой интерфейс, скорее всего, будет абстрагирован SandBoxie, если он запускает программу под другим пользователем или что-то в этом роде, чтобы защитить ее от прямого доступа к файловой системе и другим пользовательским процессам (не совсем уверен, как это работает, поскольку у меня его нет, просто догадка).

Если вы не можете понять, какое окно использовать (т. е. в какое окно отправлять нажатия клавиш), попробуйте приложение, Window Spyкоторое поставляется с AutoHotkey.

К сожалению, при использовании ControlSend, вещи не всегда работают так, как вы могли бы ожидать. Вы также можете попробовать вариант ahk_parentдля ControlSend.

В общем случае, может быть более надежным попытаться обнаружить и впоследствии использовать дескриптор окна ( HWND) вместо чего-то вроде ahk_exe game.exe--т. е. вам не придется беспокоиться о том, что дескриптор окна будет интерпретирован как что-то иное, нежели дескриптор окна, и вы можете на 100% убедиться, что у вас правильный дескриптор окна.

Еще один полезный инструмент для обнаружения многослойных окон, чтобы вы могли попробовать разные элементы управления и/или значения HWND для отправки, — это Microsoft 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.

Связанный контент