【问题标题】:How to return HWND in JAVA如何在 JAVA 中返回 HWND
【发布时间】:2015-01-27 13:43:23
【问题描述】:

附加代码根据标题搜索窗口,如果存在则激活它。

   public static void ActivateWindow() {
  User32.INSTANCE.EnumWindows(new WNDENUMPROC() {

     @Override
     public boolean callback(HWND hWnd, Pointer arg1) {
        char[] windowText = new char[512];
        User32.INSTANCE.GetWindowText(hWnd, windowText, 512);
        String wText = Native.toString(windowText);

        String title = "Chrome";
            if (wText.contains(title))
            {
            User32.INSTANCE.ShowWindow(hWnd, 9); //activeWindow()
            User32.INSTANCE.SetForegroundWindow(hWnd);   //activeWindow()
            }

        return true;   

     }
  }, null);
}

我的目标是拆分 ActivateWindow() 方法。

如果窗口存在,IsWindowOpen() 将返回 HWND 对象,并且 activateWindow() 将激活 HWND。

我找不到在回调中返回 HWND 的方法?

【问题讨论】:

    标签: java java-native-interface jna


    【解决方案1】:

    至少有两种方式

    使用实例变量:
    如果您将方法设为非静态方法,则可以在回调中访问实例变量。
    看下例中foundWindow的用法:

    public class JNA_Test {
        HWND foundWindow = null;
    
        public static void main(String[] args) {
            JNA_Test jna = new JNA_Test();
            if(jna.isWindowOpen("chrome")){
                jna.activateWindow();
            }
        }
    
        public void activateWindow() {
            if(foundWindow != null) {
                User32.INSTANCE.ShowWindow(foundWindow, 9);
                User32.INSTANCE.SetForegroundWindow(foundWindow);
            }
        }
    
        public boolean isWindowOpen(String title) {
            foundWindow = null;
            User32.INSTANCE.EnumWindows(new WNDENUMPROC() {
    
                @Override
                public boolean callback(HWND hWnd, Pointer arg1) {
                    if(foundWindow == null) {
                        char[] windowText = new char[512];
                        User32.INSTANCE.GetWindowText(hWnd, windowText, 512);
                        String wText = Native.toString(windowText);
                        if (wText.contains(title)) {
                            foundWindow = hWnd;
                        }
                    }
                    return true;
    
                }
            }, null);
    
            return foundWindow != null;
        }
    }
    


    使用 JNA 指针:
    在这个例子中,不管方法是否是静态的。
    看看foundWindowPointer的用法:

    public class JNA_Test2 {
    
        public static void main(String[] args) {
            Pointer foundWindowPointer = new Memory(Pointer.SIZE);
            JNA_Test2.isWindowOpen("chrome", foundWindowPointer);
            if (foundWindowPointer.getPointer(0) != null) {
                HWND foundWindow = new HWND(foundWindowPointer.getPointer(0));
                JNA_Test2.activateWindow(foundWindow);
            }
        }
    
        public static void activateWindow(HWND foundWindow) {
            if (foundWindow != null) {
                User32.INSTANCE.ShowWindow(foundWindow, 9);
                User32.INSTANCE.SetForegroundWindow(foundWindow);
            }
        }
    
        public static void isWindowOpen(String title, Pointer foundWindowPointer) {
            User32.INSTANCE.EnumWindows(new WNDENUMPROC() {
    
                @Override
                public boolean callback(HWND hWnd, Pointer foundWindowPointer) {
                    if (foundWindowPointer != null) {
                        char[] windowText = new char[512];
                        User32.INSTANCE.GetWindowText(hWnd, windowText, 512);
                        String wText = Native.toString(windowText);
                        if (wText.contains(title)) {
                            foundWindowPointer.setPointer(0, hWnd.getPointer());
                        }
                    }
                    return true;
    
                }
            }, foundWindowPointer);
        }
    }
    

    【讨论】:

      【解决方案2】:

      由于HWND 实际上是一个“指向某物的指针”,即void*,您可能希望在Java 端使用jna 的com.sun.jna.Pointer 类型。

      com.sun.jna.platform.win32.WinDef.HWND 在使用 jna 的 win32 平台 API 时更合适,如Handle external windows using java 的答案所示。查看How to get list of all window handles in Java (Using JNA)? 以获取另一个代码示例。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-08-09
        • 1970-01-01
        • 2016-07-18
        • 1970-01-01
        • 2021-11-18
        • 1970-01-01
        • 2013-03-28
        • 2015-10-25
        相关资源
        最近更新 更多