我已经创建了这个方法,应该返回完整的路径和文件名,以便我可以唯一标识一个程序。但是,它只返回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);
}
可能重复[在Windows操作系统中使用JNA从进程线程ID获取进程名称](http://stackoverflow.com/questions/15692460/get-process-name-from-process-thread-id-in-windows -os-using-jna) – Java42
'新的指针(1)'和'零指针'是高度可疑的。如果您想传递一个整数参数,请在方法签名中声明一个整数参数。如果你想传递一个NULL参数,传递'null'。 – technomage
我误解了hModule,它是getModuleFileNameEx方法的第二个输入,我认为它是一个指针。我已将它更改为null,但现在它打印出 而不是字符串,它仍然只检索javaw.exe进程的pid,而不是原始问题中提到的getForegroundWindow Handle'FocusedWindow'。原始帖子中的代码已更新。 –