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

GetWindowModuleFileName 和 GetModuleFileName 仅适用于 Windows NT 4 及更高版本中的当前进程(即,您只会获得当前进程窗口的有用信息)。

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

本文建议改用 PSAPI 函数GetModuleFileNameEx

编辑

您需要将窗口句柄转换为模块句柄(这可能比将窗口句柄转换为 PID 到模块句柄要短)。请记住,窗口句柄只是一个地址(因此您需要GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS标志)。

于 2013-03-28T22:31:22.153 回答