Использование JNA для получения GetForegroundWindow();
Я задал аналогичный вопрос в предыдущем потоке (qaru.site/info/244481/..., но я был ориентирован на использование JNI, и у меня не было большого успеха... Я прочитал несколько руководств, и, хотя некоторые работают нормально, другие не до сих пор не могут получить нужную мне информацию, которая является названием окна на переднем плане.
Теперь я ищу JNA, но я не могу понять, как получить доступ к GetForegroundWindow()... Я думаю, что могу распечатать текст, как только я получу дескриптор окна, используя этот код (найденный в другом потоке)
import com.sun.jna.*;
import com.sun.jna.win32.*;
public class jnatest {
public interface User32 extends StdCallLibrary {
User32 INSTANCE = (User32) Native.loadLibrary("user32", User32.class);
int GetWindowTextA(PointerType hWnd, byte[] lpString, int nMaxCount);
}
public static void main(){
byte[] windowText = new byte[512];
PointerType hwnd = //GetForegroundWindow() (?)...
User32.INSTANCE.GetWindowTextA(hwnd, windowText, 512);
System.out.println(Native.toString(windowText));
}
}
Любые предложения? Спасибо!
Ответы
Ответ 1
Как просто добавить вызов метода для сопоставления собственного GetForegroundWindow с вашим интерфейсом, примерно так:
import com.sun.jna.*;
import com.sun.jna.platform.win32.WinDef.HWND;
import com.sun.jna.win32.*;
public class JnaTest {
public interface User32 extends StdCallLibrary {
User32 INSTANCE = (User32) Native.loadLibrary("user32", User32.class);
HWND GetForegroundWindow(); // add this
int GetWindowTextA(PointerType hWnd, byte[] lpString, int nMaxCount);
}
public static void main(String[] args) throws InterruptedException {
byte[] windowText = new byte[512];
PointerType hwnd = User32.INSTANCE.GetForegroundWindow(); // then you can call it!
User32.INSTANCE.GetWindowTextA(hwnd, windowText, 512);
System.out.println(Native.toString(windowText));
}
}
Ответ 2
Если получить заголовок окна - это все, что вы хотите сделать, вам не нужно явно указывать
загрузите библиотеку user32
. JNA поставляется с ним в файле platform.jar
(at
наименее в v3.4).
Я получил эту работу здесь:
import com.sun.jna.Native;
import com.sun.jna.platform.win32.WinDef.HWND;
import com.sun.jna.platform.win32.User32;
public class JnaApp {
public static void main(String[] args) {
System.out.println("title is " + getActiveWindowTitle());
}
private static String getActiveWindowTitle() {
HWND fgWindow = User32.INSTANCE.GetForegroundWindow();
int titleLength = User32.INSTANCE.GetWindowTextLength(fgWindow) + 1;
char[] title = new char[titleLength];
User32.INSTANCE.GetWindowText(fgWindow, title, titleLength);
return Native.toString(title);
}
}
Подробнее о User32 Javadoc. Он получил почти все функции в библиотеке user32.