Подтвердить что ты не робот

Обработка внешних окон с помощью java

Мне нужно проверить, открыто ли внешнее окно (другая java-программа, но не контролируемая программой, над которой я работаю), с открытым заголовком, и если она открывается, то либо максимизировать, либо минимизировать ее на основе пользователя команда на Java (я знаю только название окна и ничего больше). Google только говорит, что я могу использовать winapi, чтобы получить дескриптор окна и манипулировать им с помощью дескриптора, но я не могу найти, как это сделать.

Я мог бы найти ссылки на то, как это сделать, используя JNI здесь: В Java Swing, как вы получаете ссылку на дескриптор окна Win32 (hwnd) для окна?. Можно ли это сделать без использования JNI?

Помогите мне понять, как это сделать.

Спасибо и с уважением

4b9b3361

Ответ 1

Я только что добавил много оконных функций, связанных с win32, в JNA. Здесь вы можете увидеть подробности .

// Find and minimize a window:
WinDef.HWND hWnd = User32.INSTANCE.FindWindow("className", "windowName");
User32.INSTANCE.ShowWindow(hWnd, WinUser.SW_MINIMIZE);

Вы также можете перечислить все окна:

final WinDef.HWND[] windowHandle = new WinDef.HWND[1];
User32.INSTANCE.EnumWindows(new WinUser.WNDENUMPROC() {
    @Override
    public boolean callback(WinDef.HWND hwnd, Pointer pointer) {
        if (matches(hwnd)) {
            windowHandle[0] = hwnd;
            return false;
        }
        return true;
    }
}, Pointer.NULL);

// Minimize or maximize windowHandle[0] here...

Ответ 2

Вы можете использовать Windows API, чтобы получить дескриптор окна, а затем изменить его размер:

EnumWindows:
http://msdn.microsoft.com/en-us/library/ms633497%28v=VS.85%29.aspx

GetNextWindow:
http://msdn.microsoft.com/en-us/library/ms633509%28v=VS.85%29.aspx

GetWindowText:   (to decide whether that is the window you want; if title matches)
http://msdn.microsoft.com/en-us/library/ms633520%28v=VS.85%29.aspx

FindWindow:  (for this you need the exact title beforehand, not just part of it)
http://msdn.microsoft.com/en-us/library/ms633499%28v=vs.85%29.aspx

ShowWindow:
http://msdn.microsoft.com/en-us/library/ms633548%28v=VS.85%29.aspx

Типичный интерфейс WinAPI, немного неуклюжий в использовании, но мощный.

Ответ 3

Java не имеет API для этого, поэтому вам нужно использовать JNI. Подробнее см. Eznme answer.

Ответ 4

Как указано, это невозможно в чистой Java. Пример его выполнения (который вам нужно перевести на JNI):

HWND hwnd = FindWindow( _T("classname"), _T("windowname") );

// Minimize
ShowWindow( hwnd, SW_MINIMIZE );

// Maximize
ShowWindow( hwnd, SW_MAXIMIZE );

У вас уже есть имя окна, но вы также должны указать имя класса, поскольку это позволяет вам более точно получить окно. Если бы было несколько окон с одинаковым именем windowname, то ваша программа могла бы сделать что-то нежелательное.

Вы можете использовать что-то вроде Spy ++ для получения имени класса. Или просто через код. Убедитесь, что ваше окно в настоящее время является единственным окном с соответствующим именем windowname, которое вы можете сделать:

TCHAR lpClassName[256] = {0};

HWND hwnd = FindWindow( _T("classname"), _T("windowname") );
GetClassName( hwnd, lpClassName, _countof( lpClassName ) );
MessageBox( NULL, _T("Class Name"), lpClassName, MB_OK );

Если вы можете получить HWND из самого процесса Java с кодом здесь, то вы должны передать это в родную часть, так как это будет гарантировано надежным.