Я пытаюсь сделать именно то, что делается здесь: Как мне получить GetModuleFileName (), если у меня есть только дескриптор окна (hWnd)?
Но в Java вместоC #.
Пока мне удалось это сделать:
public static final int PROCESS_QUERY_INFORMATION = 0x0400;
public interface User32 extends StdCallLibrary {
User32 INSTANCE = (User32) Native.loadLibrary("user32", User32.class);
int GetWindowThreadProcessId(HWND hwnd, IntByReference pid);
};
public interface Kernel32 extends StdCallLibrary {
Kernel32 INSTANCE = (Kernel32)Native.loadLibrary("kernel32", Kernel32.class);
public Pointer OpenProcess(int dwDesiredAccess, boolean bInheritHandle, int dwProcessId);
public int GetTickCount();
};
public interface psapi extends StdCallLibrary {
psapi INSTANCE = (psapi)Native.loadLibrary("psapi", psapi.class);
int GetModuleFileNameExA (Pointer process, Pointer hModule, byte[] lpString, int nMaxCount);
};
public static String getModuleFilename(HWND hwnd)
{
byte[] exePathname = new byte[512];
Pointer zero = new Pointer(0);
IntByReference pid = new IntByReference();
User32.INSTANCE.GetWindowThreadProcessId(hwnd, pid);
System.out.println("PID is " + pid.getValue());
Pointer process = Kernel32.INSTANCE.OpenProcess(PROCESS_QUERY_INFORMATION, false, pid.getValue());
int result = psapi.INSTANCE.GetModuleFileNameExA(process, zero, exePathname, 512);
String text = Native.toString(exePathname).substring(0, result);
return text;
}
Указанный дескриптор окна действителен, и PID всегда печатается успешно.«Process
» возвращает значение, но «result
» всегда равно нулю.Может ли кто-нибудь, знающий о JNA, любезно показать мне, где моя ошибка?
РЕДАКТИРОВАТЬ: Наконец, УСПЕХ! Проблема была в этой строке (где первое значение должно было быть 1040
):
Pointer process = Kernel32.INSTANCE.OpenProcess(1040, false, pid.getValue());