1

プログラムを一意に識別できるように、完全なパスとファイル名を返すこのメソッドを作成しました。ただし、C:\Program Files (x86)\Java\jre6\bin\javaw.exeフォーカスされている特定のプログラムのパスではなく、または空の文字列のみを返します。私が間違っているのは何ですか?

private void getFocusWindow() {
    HWND focusedWindow = User32.INSTANCE.GetForegroundWindow();

    char[] nameName = new char[512];
    User32.INSTANCE.GetWindowModuleFileName(focusedWindow, nameName, 512);

    System.out.println(nameName);
}

psapi の使用:

解決:

フル パスとモジュール ファイル名を提供します。唯一の例外は、Eclipse で「�」が出力される場合です。GetModuleFileNameEx メソッドの詳細については、@technomage の回答を参照してください。

private void getFocusWindow() {
    PsApi psapi = (PsApi) Native.loadLibrary("psapi", PsApi.class);

        HWND focusedWindow = User32.INSTANCE.GetForegroundWindow();
        byte[] name = new byte[1024];

        IntByReference pid = new IntByReference();
        User32.INSTANCE.GetWindowThreadProcessId(focusedWindow, pid);

        HANDLE process = Kernel32.INSTANCE.OpenProcess(0x0400 | 0x0010, false, pid.getValue());
        psapi.GetModuleFileNameExA(process, null, name, 1024);
        String nameString= Native.toString(name);

        System.out.println(nameString);
}

psapi クラス:

public interface PsApi extends StdCallLibrary {

    int GetModuleFileNameExA(HANDLE process, HANDLE module ,
        byte[] name, int i);

}
4

1 に答える 1

1

Windows NT 4 以降では、GetWindowModuleFileName と GetModuleFileName は現在のプロセスでのみ機能します (つまり、現在のプロセスのウィンドウに関する有用な情報のみを取得します)。

http://support.microsoft.com/?id=228469

この記事では、代わりに PSAPI 関数GetModuleFileNameExを使用することを推奨しています。

編集

ウィンドウ ハンドルをモジュール ハンドルに変換する必要があります(これは、ウィンドウ ハンドルを PID からモジュール ハンドルに変換するよりも短い可能性があります)。GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESSウィンドウ ハンドルは単なるアドレスであることに注意してください (フラグが必要になります)。

于 2013-03-28T22:31:22.153 に答える