Активное окно другого процесса в Java - PullRequest
3 голосов
/ 07 декабря 2011

У меня есть два Java-приложения Swing (значит, работает в двух JVM). Есть ли способ переключаться между ними? Активно окно другого приложения по коду Java?

1 Ответ

3 голосов
/ 11 апреля 2012

Вы можете попробовать использовать JNA. Я дам вам некоторый код для Windows (более или менее будет для других систем) с использованием Maven: (извините, но я не могу правильно отформатировать)

  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), на котором вы хотите сфокусироваться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...