【问题标题】:Active other process's window in Java在 Java 中激活其他进程的窗口
【发布时间】:2023-03-24 06:11:01
【问题描述】:

我有两个 Java swing 应用程序(意味着在两个 JVM 中运行)。有没有办法在它们之间切换?通过 Java 代码激活另一个应用程序的窗口?

【问题讨论】:

  • 不,纯Java没有办法
  • “在它们之间切换”是什么意思? alt+tab 将在它们之间切换一次...
  • 参见本地JVM之间的通信stackoverflow.com/questions/5052102/…
  • 查看 RMI(远程方法调用):docs.oracle.com/javase/tutorial/rmi/index.html
  • 您似乎想与已经运行的JVM进程进行交互。所以,我认为LauncherProcessBuilder 不能满足您的要求,因为它将启动一个新的JVM 进程。如果这是基于 Windows 的 Java Swing 应用程序,您可以使用 JNA 调用 User32 FindWindow 函数来搜索具有给定窗口标题名称的窗口并根据其进程 ID 设置其活动状态。

标签: java swing jvm


【解决方案1】:

您可以尝试使用 JNA。我将为您提供一些使用 Maven 的 Windows 代码(或多或少适用于其他系统): (抱歉,我无法正确格式化)

  1. 创建 Maven 项目,并添加依赖项:

    <dependency>
        <groupId>net.java.dev.jna</groupId>
        <artifactId>jna</artifactId>
        <version>3.4.0</version>
    </dependency>
    <dependency>
        <groupId>net.java.dev.jna</groupId>
        <artifactId>platform</artifactId>
        <version>3.4.0</version>
    </dependency>
    
  2. 创建界面

    public interface User32 extends StdCallLibrary {
        User32 INSTANCE = (User32) Native.loadLibrary("user32", User32.class, W32APIOptions.DEFAULT_OPTIONS);
        HWND GetParent(HWND hWnd);
        HWND FindWindow(String lpClassName, String lpWindowName);
        HWND SetFocus(HWND hWnd);
        HWND FindWindowEx(HWND hwndParent, HWND hwndChildAfter, String lpszClass, String lpszWindow);
        int GetWindowText(HWND hWnd, char[] lpString, int nMaxCount);
    }
    
  3. 创建类

    public final class Win32WindowUtils {
        private static final int WIN_TITLE_MAX_SIZE = 512;
    
        public HWND GetWindowHandle(String strSearch, String strClass) {
            char[] lpString = new char[WIN_TITLE_MAX_SIZE];
            String strTitle;
            int iFind = -1;
            HWND hWnd = User32.INSTANCE.FindWindow(strClass, null);
            while(hWnd != null) {
                User32.INSTANCE.GetWindowText(hWnd, lpString, WIN_TITLE_MAX_SIZE);
                strTitle = new String(lpString);
                strTitle = strTitle.toUpperCase();
                iFind = strTitle.indexOf(strSearch);
                if(iFind != -1) {
                    return hWnd;
                }
                hWnd = User32.INSTANCE.FindWindowEx(null, hWnd, strClass, null);
            }
            return hWnd;
        }
    }
    
  4. 并调用

    User32.INSTANCE.SetFocus(Win32WindowUtils.GetWindowHandle(windowTitle.toUpperCase(), null);
    

当然 - windowTitle 是您要关注的窗口标题 (String)。

【讨论】:

  • 哇!永远不要指望有人会连续拍摄。因为我的请求看起来很有线。让我花一些时间来理解代码。非常感谢!!
  • 其实你可以克隆我的库(Mercurial)来看看它是如何工作的:library
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-05-27
  • 1970-01-01
  • 2021-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多