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