¿Cómo se puede ejecutar el script autohotkey en segundo plano solo con PID disponible?

¿Cómo se puede ejecutar el script autohotkey en segundo plano solo con PID disponible?

Me gusta ejecutar un script de autohotkey en segundo plano dentro de una máquina virtual (sandboxie). El script presionará las teclas f1-f8 en un bucle sin fin. Se supone que también tiene efectos en un juego que se ejecuta en la máquina virtual.

Estoy bastante seguro de que necesito usarlo ControlSend, así se vería así

ControlSend, , {f1}, HERE_COMES_THE_WINDOW_NAME

pero no puedo usar el nombre de la ventana por algún motivo, así que me gusta usar PID en su lugar.

¿Es posible hacerlo y, en caso afirmativo, cómo?

La máquina virtual se ve así (Game.exe es el juego donde me gusta ejecutar el script Autohotkey):

ingrese la descripción de la imagen aquí

Respuesta1

Supongo que la única forma de interactuar con una aplicación que se ejecuta en Sandboxie es a través de la interfaz de ventana que proporciona la aplicación. Es probable que SandBoxie abstraiga cualquier tipo de interfaz directa si está ejecutando el programa con un usuario diferente o cualquier otra cosa para protegerlo del acceso directo al sistema de archivos y otros procesos del usuario (no estoy realmente seguro de cómo funciona ya que no tengo es sólo una suposición).

Si no puede determinar qué ventana usar (es decir, a qué ventana enviar las pulsaciones de teclas), pruebe la Window Spyaplicación que viene con AutoHotkey.

Desafortunadamente, cuando se utiliza ControlSend, las cosas no siempre funcionan como se espera. Es posible que también quieras probar la ahk_parentopción para ControlSend.

En general, también puede ser más confiable intentar detectar y posteriormente usar el identificador de ventana ( HWND) en lugar de algo como ahk_exe game.exe--es decir, no tiene que preocuparse de que el identificador de ventana se interprete como algo más que el identificador de ventana. y podrá confirmar al 100% que tiene el identificador de ventana correcto.

Otra herramienta útil para detectar ventanas de varias capas para que pueda probar diferentes controles y/o valores HWND para enviarlos es Microsoft Spy++, que le mostrará la jerarquía y los nombres de los controles de las ventanas. Esto puede permitirle encontrar el valor de control correcto para enviarlo si la ventana principal no funciona. Nuevamente, esto realmente solo es útil si lo estás usando ControlSendpara intentar enviar algo a una ventana que no está activa; si solo estás usando SendInputpara enviar algo a una ventana activa, entonces Spy++no te dirá nada útil.

Volviendo a la pregunta original sobre cómo acceder al proceso mediante PID, el único valor aquí sería garantizar potencialmente que tiene el identificador de ventana correcto vinculado a un PID en particular (pero aún estaría enviando algo a la ventana, por lo que esto es solo un forma indirecta de conseguir la ventana). Para hacer eso, puede usar el código a continuación.

Extracto de código de:Cómo pausar un proceso externo

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

Volviendo también a la pregunta original:

No puedo usar el nombre de la ventana por alguna razón.

No dijiste exactamente qué síntomas te llevaron a creer esto, pero supongo que podría ser algo como "simplemente no funcionó".

Si ese es el caso, también recomendaría intentar simplificar el problema si es posible y hacerlo funcionar con algo que pueda probarse definitivamente. Por ejemplo, ejecutar notepadSandboxie y enviarlo Alt+F4para matarlo, o algo por el estilo. O haga que algo básico funcione fuera de Sandboxie y luego intente que funcione dentro de Sandboxie para asegurarse de que Sandboxie en sí no tenga nada que ver con la ruptura del script. Si el script no funciona desde el principio y no funciona fuera de Sandboxie, entonces tampoco funcionará con un programa dentro de Sandboxie.

información relacionada