PID를 사용하여 백그라운드에서 자동 핫키 스크립트를 어떻게 실행할 수 있습니까?

PID를 사용하여 백그라운드에서 자동 핫키 스크립트를 어떻게 실행할 수 있습니까?

저는 가상 머신(샌드박스) 내부의 백그라운드에서 자동 핫키 스크립트를 실행하는 것을 좋아합니다. 스크립트는 무한 루프에서 f1-f8 키를 누릅니다. 가상 머신에서 실행되는 게임에도 영향을 미칠 것으로 예상됩니다.

을 사용해야 한다고 확신하므로 ControlSend이렇게 보일 것입니다.

ControlSend, , {f1}, HERE_COMES_THE_WINDOW_NAME

하지만 어떤 이유로 창 이름을 사용할 수 없어서 대신 PID를 사용하고 싶습니다.

그게 가능합니까? 그렇다면 어떻게 합니까?

가상 머신은 다음과 같습니다(Game.exe는 Autohotkey 스크립트를 실행하는 게임입니다):

여기에 이미지 설명을 입력하세요

답변1

나는 Sandboxie에서 실행되는 애플리케이션과 상호 작용할 수 있는 유일한 방법은 애플리케이션이 제공하는 창 인터페이스를 통하는 것이라고 추측합니다. 모든 종류의 직접 인터페이스는 다른 사용자로 프로그램을 실행하거나 파일 시스템 및 기타 사용자 프로세스에 직접 액세스하지 못하도록 보호하기 위해 SandBoxie에 의해 추상화될 가능성이 높습니다. 그냥 추측입니다).

어느 창을 사용해야 할지(즉, 어느 창으로 키 입력을 보낼지) 알 수 없다면 Window SpyAutoHotkey와 함께 제공되는 응용 프로그램을 사용해 보십시오.

불행하게도 를 사용할 때 ControlSend항상 예상한 대로 작동하는 것은 아닙니다. ahk_parent에 대한 옵션을 시도해 볼 수도 있습니다 ControlSend.

일반적으로 --ie 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

또한 원래 질문으로 돌아가면 다음과 같습니다.

어떤 이유로 창 이름을 사용할 수 없습니다

당신은 어떤 증상으로 인해 이것을 믿게 되었는지 정확히 밝히지 않았지만 "그냥 작동하지 않았다"는 말과 같은 것일 수도 있다고 추측합니다.

그렇다면 가능하다면 문제를 단순화하고 확실하게 테스트할 수 있는 작업을 수행하는 것이 좋습니다. 예를 들어, notepadSandboxie에서 실행하고 이를 보내서 Alt+F4죽이거나 그런 라인을 따르는 것입니다. 또는 Sandboxie 외부에서 작동하기 위한 기본적인 것을 얻은 다음 Sandboxie 내부에서 작동하도록 하여 Sandboxie 자체가 스크립트 중단과 관련이 없는지 확인하십시오. 스크립트가 처음부터 손상되어 Sandboxie 외부에서 작동하지 않으면 Sandboxie 내부의 프로그램에서도 작동하지 않습니다.

관련 정보