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

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

ControlSend, , {f1}, HERE_COMES_THE_WINDOW_NAME

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

Можно ли это сделать, и если да, то как?

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

1 ответ1

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.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .