gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 07:43:24 26 4
gpt4 key购买 nike

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

解决方案:

提供完整路径和模块文件名,唯一的异常(exception)是在 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);

}

最佳答案

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

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

文章推荐使用PSAPI函数GetModuleFileNameEx相反。

编辑

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

关于java - 焦点窗口的 GetModuleFileName JNA Windows 操作系统,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15693210/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com