Использование JNA для получения GetForegroundWindow (); - PullRequest
10 голосов
/ 24 апреля 2011

Я задал похожий вопрос в предыдущей теме (/4381173/uznaite-kakoe-prilozhenie-okno-nahoditsya-v-fokuse-v-java), но мне порекомендовали использовать 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));

    }
}

Есть предложения? Спасибо!

Ответы [ 2 ]

11 голосов
/ 24 апреля 2011

Как насчет простого добавления вызова метода для соответствия родному 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));
   }
}
6 голосов
/ 25 апреля 2012

Если вы хотите получить заголовок окна, вам не нужно явно загрузить библиотеку user32. JNA поставляется с ним, в файле platform.jar (в по крайней мере, в 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's Javadoc . Он имеет почти все функции в библиотеке user32.

...