焦点窗口的GetModuleFileName JNA Windows操作系统

时间:2013-03-28 22:22:39

标签: java windows jna

我创建了这个方法,它应该返回完整的路径和文件名,以便我可以唯一地识别程序。但是,它只返回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:

解决方案:

提供完整路径和模块文件名,只有当它打印出' '时才会出现异常。有关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);

}

1 个答案:

答案 0 :(得分:1)

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

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

本文建议改为使用PSAPI函数GetModuleFileNameEx

修改

您需要convert the Window handle to a module handle(这可能比将窗口句柄转换为PID到模块句柄的时间短)。请记住,窗口句柄只是一个地址(因此您需要GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS标志)。