PID が利用可能な場合にのみ、バックグラウンドで autohotkey スクリプトを実行するにはどうすればよいですか?

PID が利用可能な場合にのみ、バックグラウンドで autohotkey スクリプトを実行するにはどうすればよいですか?

私は仮想マシン (サンドボックス) 内のバックグラウンドで autohotkey スクリプトを実行するのが好きです。スクリプトは無限ループで f1 ~ f8 キーを押します。仮想マシンで実行されるゲームにも効果があるはずです。

を使う必要があると思うのでControlSend、次のようになります

ControlSend, , {f1}, HERE_COMES_THE_WINDOW_NAME

しかし、何らかの理由でウィンドウ名を使用できないため、代わりに PID を使用します。

それは可能ですか?可能であれば、どのようにすればよいですか?

仮想マシンは次のようになります (Game.exe は、Autohotkey スクリプトを実行するゲームです)。

ここに画像の説明を入力してください

答え1

Sandboxie で実行中のアプリケーションと対話できる唯一の方法は、アプリケーションが提供するウィンドウ インターフェイスを使用することだと思います。プログラムを別のユーザーで実行している場合など、ファイル システムや他のユーザー プロセスに直接アクセスしないようにするために、あらゆる種類の直接インターフェイスが SandBoxie によって抽象化される可能性があります (実際にどのように機能するかはわかりませんが、私は持っていません。推測にすぎません)。

どのウィンドウを使用するか (つまり、どのウィンドウにキーストロークを送信するか) がわからない場合は、Window SpyAutoHotkey に付属のアプリケーションを試してください。

残念ながら、 を使用するとControlSend、期待どおりに動作しないことがあります。ahk_parentの オプションを試してみるのもよいでしょうControlSend

一般的に、ウィンドウ ハンドル ( ) を検出して使用してみる方が、 -- のHWNDようなものよりも信頼性が高い場合もありますahk_exe game.exe。つまり、ウィンドウ ハンドルがウィンドウ ハンドル以外のものとして解釈されることを心配する必要がなく、正しいウィンドウ ハンドルを持っていることを 100% 確認できます。

送信先のさまざまなコントロールや HWND 値を試すことができる、多層ウィンドウを検出するためのもう 1 つの便利なツールは、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 内のプログラムでも動作しません。

関連情報