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

0

Eu 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 ele tenha efeitos em um jogo que também é executado na máquina virtual.

Tenho certeza de que preciso usar ControlSend , então seria parecido com isso

ControlSend, , {f1}, HERE_COMES_THE_WINDOW_NAME

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

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

A máquina virtual se parece com isso (Game.exe é o jogo onde eu gosto de executar o script Autohotkey):

    
por tenepolis 31.03.2018 / 00:49

1 resposta

1

Eu estou supondo que a única maneira que você pode interagir com um aplicativo em execução no Sandboxie é através da interface da janela que o aplicativo fornece. Qualquer tipo de interface direta provavelmente será abstraída pela SandBoxie se estiver rodando 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 conseguir descobrir qual janela usar (ou seja, para qual janela enviar pressionamentos de teclas), tente o aplicativo Window Spy que vem com o AutoHotkey.

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

Em geral, também pode ser mais confiável tentar detectar e subsequentemente usar o identificador de janela ( HWND ) em vez de algo como ahk_exe game.exe - ou seja, você não precisa se preocupar com o manipulador de janela interpretado como algo diferente do identificador de janela, e você pode 100% confirmar que você tem o identificador de janela à direita.

Outra ferramenta útil para detectar janelas com múltiplas camadas, para que você possa experimentar controles diferentes 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 realmente é útil apenas se você estiver usando ControlSend para tentar enviar algo para uma janela que não está ativa - se você está usando apenas SendInput para enviar algo para uma janela ativa, então Spy++ não é vai te dizer qualquer coisa útil.

Voltando à pergunta original ao acessar o processo pelo PID, o único valor aqui seria garantir potencialmente que você tenha o identificador de janela direito vinculado a um PID específico (mas você ainda estaria enviando algo para a janela, portanto, é apenas uma maneira indireta de obter a janela). Para fazer isso, você poderia 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:

i cannot use window name for some reason

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

Se for esse o caso, recomendo também tentar simplificar o problema, se possível, e fazê-lo funcionar com algo que possa ser definitivamente testado. Por exemplo, executando notepad no Sandboxie e enviando Alt+F4 para eliminá-lo, ou algo assim. Ou consiga algo básico para trabalhar fora do Sandboxie e, em seguida, tente fazê-lo funcionar dentro do Sandboxie para garantir que o Sandboxie em si não tenha nada a ver com a quebra do seu script. Se o script estiver quebrado e não funcionar fora do Sandboxie, também não funcionará com um programa dentro do Sandboxie.

    
por 31.03.2018 / 21:55