Я разрабатываю приложение Swing, и мне нужно прошить панель задач Windows. Я не могу использовать frame.requestFocus()
, потому что не хочу перехватывать фокус у какого-либо другого приложения.
Как я могу прошить панель задач Windows с помощью Swing?
Ответы (5)
Я не знаю, применимо ли это к более новым версиям Windows, но метод .toFront() использовался для мигания окна, если ни одно из окон текущей виртуальной машины не было на переднем плане.
Это означает, что вызов frame.toFront() для свернутого кадра всегда заставит его мигать...
JNIWrapper с его расширением winpack может делать то, что вы хотите.
Демо на сайте показывает его в действии.
Вы можете принудительно свернуть свой графический интерфейс и .toFront
-en его:
Gui.frame.setState(Frame.ICONIFIED);
for (int i = 0; i < 3; i++) {
Thread.sleep(10);
Gui.frame.toFront();
Thread.sleep(10);
Gui.frame.setVisible(false);
Thread.sleep(10);
Gui.frame.toBack();
Thread.sleep(10);
Gui.frame.setVisible(true);
}
// be creative!!
что, к сожалению, удалит фокус с активного окна. Вы можете узнать активное окно и повторно активировать его впоследствии. Но все же мигание будет длиться всего около трех секунд.
...или докопайтесь до сути дела, используя DLL-вызов FlashWindow
. Вызов dll невозможен с чистым кодом Java, вам понадобится помощь других языков программирования, возможно, например. с JNA. Помимо этого, вы также можете написать свою собственную программу на другом языке и вызывать ее из своего Java-приложения. Я приведу пример в AutoHotkey ниже:
Код автогорячей клавиши:
if 0 != 1 ; note: in ahk, 1 corresponds args[1] and 0 corresponds args.length
{
msgbox, There needs to be ONE parameter passed over to this file, which is the name of the window that should be flashed.
ExitApp
}
programName = %1%
winget, hWnd, ID, %programName%
DllCall("FlashWindow",UInt,hWnd,Int,True)
скомпилированный в файл с именем flash.exe
, помещенный в ваш рабочий каталог Java, вы можете вызвать его из любой функции:
Runtime.getRuntime().exec("./flash.exe \"" + MyJFrame.getTitle() + "\"");
В качестве альтернативы можно использовать AutoHotkey.dll и получить к нему доступ в Javacode (в Интернете есть руководства о том, как это сделать), поэтому не будет необходимости во внешних исполняемых файлах.
Если у вас все еще есть проблемы с миганием панели задач Windows, сообщите мне об этом!
Лучший способ сделать это:
if (!isFocused()) {
setVisible(false);
setVisible(true);
}
Используя Swing как таковой, вы, скорее всего, не сможете; это особенность Widnows.