Обработка внешних окон с помощью java
Мне нужно проверить, открыто ли внешнее окно (другая java-программа, но не контролируемая программой, над которой я работаю), с открытым заголовком, и если она открывается, то либо максимизировать, либо минимизировать ее на основе пользователя команда на Java (я знаю только название окна и ничего больше). Google только говорит, что я могу использовать winapi
, чтобы получить дескриптор окна и манипулировать им с помощью дескриптора, но я не могу найти, как это сделать.
Я мог бы найти ссылки на то, как это сделать, используя JNI здесь:
В Java Swing, как вы получаете ссылку на дескриптор окна Win32 (hwnd) для окна?. Можно ли это сделать без использования JNI?
Помогите мне понять, как это сделать.
Спасибо и с уважением
Ответы
Ответ 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 с кодом здесь, то вы должны передать это в родную часть, так как это будет гарантировано надежным.