JNA を使用して、現在実行中のすべての Windows プログラムとそのコマンド ラインのリストを取得する方法を探しています。このサイトにはいくつかのチュートリアルがあります ( Get list of processes on Windows in a charset-safe way ) 実行中のプログラム名のリストを取得する方法を示していますが、完全なコマンドラインを探しています。これを行うための Module32First 関数の使用について言及している投稿を見たことがありますが、JNA を介してそれを使用する方法に関するドキュメントが見つからないようです。何か案は?
編集:
私は現在、前述の投稿から以下を試しました。アイデアは、ウィンドウで現在実行中のすべてのプロセスを反復処理し、それらのコマンド ラインを取得するプロセス内の方法が必要であるということです。wmic は使いたくありません。
Kernel32 kernel32 = (Kernel32) Native.loadLibrary(Kernel32.class, W32APIOptions.UNICODE_OPTIONS);
Tlhelp32.PROCESSENTRY32.ByReference processEntry = new Tlhelp32.PROCESSENTRY32.ByReference();
WinNT.HANDLE snapshot = kernel32.CreateToolhelp32Snapshot(Tlhelp32.TH32CS_SNAPPROCESS, new WinDef.DWORD(0));
try {
while (kernel32.Process32Next(snapshot, processEntry)) {
System.out.println(processEntry.th32ProcessID + "\t" + Native.toString(processEntry.szExeFile));
}
}
finally {
kernel32.CloseHandle(snapshot);
}
EDIT2:
Windows API(http://msdn.microsoft.com/en-us/library/windows/desktop/ms684839(v=vs.85).aspx)を見ると、以下のように表示されます。JNAを介して実行可能ファイルへのフルパスを取得しようとしています。JNAがMODULE32ENTRY構造ではなく、Module32First関数をサポートしていないと思います。
szExeFile プロセスの実行可能ファイルの名前。実行可能ファイルへの完全なパスを取得するには、Module32First 関数を呼び出し、返された MODULEENTRY32 構造体の szExePath メンバーを確認します。ただし、呼び出し元のプロセスが 32 ビット プロセスの場合は、QueryFullProcessImageName 関数を呼び出して、64 ビット プロセスの実行可能ファイルの完全なパスを取得する必要があります。