java - Brug JNA til at få GetForegroundWindow ();

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg stillede et lignende spørgsmål om en tidligere tråd (https://stackoverflow.com/questions/5206633/java-find-out-what-application-window-is-in-focus), men jeg blev guidet til at bruge JNI, og jeg 'Jeg har ikke meget succes med det ... Jeg har læst nogle tutorials og mens nogle fungerer fint, kan andre jeg ikke få de oplysninger, jeg har brug for, hvilket er vinduets titel på forgrunden. [[


Nu ser jeg på JNA, men jeg kan ikke finde ud af, hvordan man får adgang til GetForegroundWindow () ... Jeg tror, ​​jeg kan udskrive teksten, når jeg får håndtaget til vinduet ved hjælp af denne kode (fundet på en anden tråd):


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));

    }
}


Nogen forslag? Tak!

Bedste reference


Hvad med blot at tilføje et metodeopkald for at matche den indfødte GetForegroundWindow til din grænseflade, noget som sådan:


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));
   }
}

Andre referencer 1


Hvis du får vinduetitel er alt, hvad du vil gøre, behøver du ikke eksplicit
Indlæs user32 biblioteket. JNA følger med den i platform.jar filen (på
mindst i v3.4 det gør det).


Jeg har arbejdet her:


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);
    }

}


Se mere på User32 s Javadoc. Det har næsten alle funktionerne i bruger32 biblioteket. [7]