Wie können Sie ein Autohotkey-Skript im Hintergrund nur mit verfügbarem PID ausführen?

Wie können Sie ein Autohotkey-Skript im Hintergrund nur mit verfügbarem PID ausführen?

Ich möchte ein Autohotkey-Skript im Hintergrund in einer virtuellen Maschine (Sandboxie) ausführen. Das Skript drückt die Tasten F1-F8 in einer Endlosschleife. Es soll auch Auswirkungen auf ein Spiel haben, das auf der virtuellen Maschine läuft.

Ich bin ziemlich sicher, dass ich verwenden muss ControlSend, also würde es so aussehen

ControlSend, , {f1}, HERE_COMES_THE_WINDOW_NAME

aber aus irgendeinem Grund kann ich den Fensternamen nicht verwenden, deshalb verwende ich stattdessen lieber PID.

Ist das möglich und wenn ja, wie?

Die virtuelle Maschine sieht folgendermaßen aus (Game.exe ist das Spiel, in dem ich das Autohotkey-Skript gerne ausführe):

Bildbeschreibung hier eingeben

Antwort1

Ich vermute, dass Sie mit einer in Sandboxie ausgeführten Anwendung nur über die von der Anwendung bereitgestellte Fensterschnittstelle interagieren können. Jede Art von direkter Schnittstelle wird wahrscheinlich von SandBoxie abstrahiert, wenn das Programm unter einem anderen Benutzer oder so ausgeführt wird, um es vor dem direkten Zugriff auf das Dateisystem und andere Benutzerprozesse zu schützen (ich bin mir nicht wirklich sicher, wie das funktioniert, da ich es nicht habe, nur eine Vermutung).

Wenn Sie nicht herausfinden können, welches Fenster Sie verwenden sollen (d. h. an welches Fenster die Tastenanschläge gesendet werden sollen), versuchen Sie es mit der Window SpyAnwendung, die mit AutoHotkey geliefert wird.

Leider funktioniert es bei der Verwendung nicht immer wie erwartet. Sie können auch die Option für ControlSendausprobieren .ahk_parentControlSend

Im Allgemeinen ist es möglicherweise auch zuverlässiger, zu versuchen, den Fenster-Handle ( HWND) zu erkennen und anschließend zu verwenden, anstatt etwas wie ahk_exe game.exe--ie, Sie müssen sich keine Sorgen machen, dass der Fenster-Handle als etwas anderes als der Fenster-Handle interpretiert wird, und Sie können zu 100 % sicher sein, dass Sie den richtigen Fenster-Handle haben.

Ein weiteres nützliches Tool zum Erkennen mehrschichtiger Fenster, sodass Sie verschiedene Steuerelemente und/oder HWND-Werte zum Senden ausprobieren können, ist Microsoft Spy++. Es zeigt Ihnen die Hierarchie und die Steuerelementnamen für die Fenster an. Auf diese Weise können Sie möglicherweise den richtigen Steuerelementwert zum Senden finden, wenn das übergeordnete Fenster nicht funktioniert. Auch dies ist nur dann wirklich nützlich, wenn Sie versuchen, ControlSendetwas an ein Fenster zu senden, das nicht aktiv ist. Wenn Sie nur verwenden, SendInputum etwas an ein aktives Fenster zu senden, Spy++wird Ihnen dies nichts Nützliches sagen.

Um auf die ursprüngliche Frage zum Zugriff auf den Prozess per PID zurückzukommen: Der einzige Wert hier wäre, potenziell zu garantieren, dass Sie den richtigen Fenster-Handle mit einer bestimmten PID verknüpft haben (aber Sie würden trotzdem etwas an das Fenster senden, also ist dies nur ein indirekter Weg, um das Fenster zu erhalten). Dazu könnten Sie den unten stehenden Code verwenden.

Codeauszug aus:So unterbrechen Sie einen externen Prozess

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

Um noch einmal auf die ursprüngliche Frage zurückzukommen:

ich kann den Fensternamen aus irgendeinem Grund nicht verwenden

Sie haben nicht genau angegeben, aufgrund welcher Symptome Sie das glauben, aber ich vermute, es könnte etwas in der Art sein wie „es hat einfach nicht funktioniert“.

Wenn das der Fall ist, würde ich auch empfehlen, das Problem möglichst zu vereinfachen und es mit etwas zum Laufen zu bringen, das definitiv getestet werden kann. Zum Beispiel, indem man es notepadin Sandboxie ausführt und es sendet, Alt+F4um es zu beenden, oder etwas in dieser Art. Oder bringen Sie etwas Grundlegendes außerhalb von Sandboxie zum Laufen und versuchen Sie dann, es innerhalb von Sandboxie zum Laufen zu bringen, um sicherzustellen, dass Sandboxie selbst nichts mit dem Absturz Ihres Skripts zu tun hat. Wenn das Skript von Anfang an kaputt ist und außerhalb von Sandboxie nicht funktioniert, wird es auch mit einem Programm innerhalb von Sandboxie nicht funktionieren.

verwandte Informationen