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.