2013-03-28 27 views
1

我已经创建了这个方法,应该返回完整的路径和文件名,以便我可以唯一标识一个程序。但是,它只返回C:\Program Files (x86)\Java\jre6\bin\javaw.exe或空字符串,而不是特定焦点中的特定程序的路径。我做错了什么?GetModuleFileName窗口焦点JNA Windows操作系统

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); 

} 
+0

可能重复[在Windows操作系统中使用JNA从进程线程ID获取进程名称](http://stackoverflow.com/questions/15692460/get-process-name-from-process-thread-id-in-windows -os-using-jna) – Java42

+0

'新的指针(1)'和'零指针'是高度可疑的。如果您想传递一个整数参数,请在方法签名中声明一个整数参数。如果你想传递一个NULL参数,传递'null'。 – technomage

+0

我误解了hModule,它是getModuleFileNameEx方法的第二个输入,我认为它是一个指针。我已将它更改为null,但现在它打印出 而不是字符串,它仍然只检索javaw.exe进程的pid,而不是原始问题中提到的getForegroundWindow Handle'FocusedWindow'。原始帖子中的代码已更新。 –

回答

1

GetWindowModuleFileName和GetModuleFileName当前进程只工作(即你得到的就只是当前进程的窗口有用的信息)在Windows NT 4.0和更高版本。

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

文章建议使用PSAPI函数GetModuleFileNameEx代替。

编辑

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

+0

我刚刚尝试过使用PSAPI,但是我现在遇到OpenProcess问题,它给了我错误:'类型不匹配:无法从WinNT.HANDLE转换为指针'。我已将创建的新方法和psapi界面添加到原始帖子中。 –