【问题标题】:Using JNA to get GetForegroundWindow();使用 JNA 获取 GetForegroundWindow();
【发布时间】:2011-08-11 15:30:38
【问题描述】:

我在上一个帖子(https://stackoverflow.com/questions/5206633/java-find-out-what-application-window-is-in-focus))上问了一个类似的问题,但我被引导使用 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));

    }
}

有什么建议吗?谢谢!

【问题讨论】:

    标签: java windows winapi jna


    【解决方案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));
       }
    }
    

    【讨论】:

    • 感谢您的快速回复!我无法编译该代码,由于某种原因,我无法导入 com.sun.jna.platform.win32.WinDef.HWND;和 HWND GetForegroundWindow();似乎无效。自然,我在尝试调用它时也会出错。我会错过什么吗?
    • @Hovercraft Full Of Eels 不,我不小心提交得太快了。现在是完整的回复:P
    • 任何帮助将不胜感激:)
    • @Daniel:这可能是我的一个愚蠢愚蠢的问题,但是您下载了 JNA 库吗?您是否已将它们添加到您的类路径中,或者如果使用 IDE 到您的 IDE 的构建路径中?
    • @Daniel,您是否在构建路径的库中同时包含 jna.jar 和 platform.jar?
    【解决方案2】:

    如果您只想获取窗口标题,则不必显式 加载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 库中的所有功能。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-14
      • 2020-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-26
      • 1970-01-01
      • 2012-04-15
      相关资源
      最近更新 更多