Como você pode executar o script autohotkey em segundo plano apenas com o PID disponível?

Como você pode executar o script autohotkey em segundo plano apenas com o PID disponível?

Gosto de executar um script autohotkey em segundo plano dentro de uma máquina virtual (sandboxie). O script pressionará as teclas f1-f8 em um loop infinito. Supõe-se que também tenha efeitos em um jogo que roda na máquina virtual.

Tenho certeza que preciso usar ControlSend, então ficaria assim

ControlSend, , {f1}, HERE_COMES_THE_WINDOW_NAME

mas não posso usar o nome da janela por algum motivo, então gosto de usar o PID em vez dele.

Isso é possível fazer e se sim, como?

A máquina virtual fica assim (Game.exe é o jogo onde gosto de executar o script Autohotkey):

insira a descrição da imagem aqui

Responder1

Suponho que a única maneira de interagir com um aplicativo em execução no Sandboxie é por meio da interface da janela fornecida pelo aplicativo. Qualquer tipo de interface direta provavelmente será abstraída pelo SandBoxie se estiver executando o programa sob um usuário diferente ou algo assim para protegê-lo de acessar diretamente o sistema de arquivos e outros processos do usuário (não tenho certeza de como funciona, pois não tenho isso, apenas um palpite).

Se você não consegue descobrir qual janela usar (ou seja, para qual janela enviar as teclas digitadas), experimente o Window Spyaplicativo que vem com o AutoHotkey.

Infelizmente, ao usar ControlSend, as coisas nem sempre funcionam como você espera. Você também pode tentar a ahk_parentopção para ControlSend.

Em geral, também pode ser mais confiável tentar detectar e posteriormente usar o identificador da janela ( HWND) em vez de algo como ahk_exe game.exe--ou seja, você não precisa se preocupar com o identificador da janela sendo interpretado como algo diferente do identificador da janela, e você pode confirmar 100% que possui a alça de janela correta.

Outra ferramenta útil para detectar janelas de múltiplas camadas para que você possa tentar diferentes controles e/ou valores HWND para enviar é o Microsoft Spy++, que mostrará a hierarquia e os nomes de controle das janelas. Isso pode permitir que você encontre o valor de controle correto para enviar se a janela pai não funcionar. Novamente, isso só é realmente útil se você estiver usando ControlSendpara tentar enviar algo para uma janela que não está ativa - se você estiver apenas usando SendInputpara enviar algo para uma janela ativa, Spy++não dirá nada de útil.

Voltando à pergunta original sobre como acessar o processo por PID, o único valor aqui seria potencialmente garantir que você tenha o identificador de janela correto vinculado a um PID específico (mas você ainda estaria enviando algo para a janela, então isso é apenas um maneira indireta de obter a janela). Para fazer isso, você pode usar o código abaixo.

Trecho do código de:Como pausar um processo 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

Voltando também à pergunta original:

não consigo usar o nome da janela por algum motivo

Você não declarou exatamente quais sintomas o levaram a acreditar nisso, mas acho que pode ser algo como "simplesmente não funcionou".

Se for esse o caso, eu também recomendaria tentar simplificar o problema, se possível, e fazê-lo funcionar com algo que possa ser testado definitivamente. Por exemplo, rodar notepadno Sandboxie e enviá-lo Alt+F4para matá-lo, ou algo nesse sentido. Ou faça com que algo básico funcione fora do Sandboxie e tente fazê-lo funcionar dentro do Sandboxie para garantir que o próprio Sandboxie não tenha nada a ver com a quebra do seu script. Se o script estiver quebrado desde o início e não funcionar fora do Sandboxie, também não funcionará com um programa dentro do Sandboxie.

informação relacionada