Как я могу прошить панель задач Windows с помощью Swing?

Я разрабатываю приложение Swing, и мне нужно прошить панель задач Windows. Я не могу использовать frame.requestFocus(), потому что не хочу перехватывать фокус у какого-либо другого приложения.


person Rob Mayhew    schedule 28.01.2009    source источник


Ответы (5)


Я не знаю, применимо ли это к более новым версиям Windows, но метод .toFront() использовался для мигания окна, если ни одно из окон текущей виртуальной машины не было на переднем плане.

Это означает, что вызов frame.toFront() для свернутого кадра всегда заставит его мигать...

person Powerlord    schedule 28.01.2009
comment
У этого подхода есть обратная сторона. Если пользователь находится в приложении, печатая, например, JTextArea, эта функциональность убирает фокус и прерывает ввод текста. - person Jamie McIlroy; 26.05.2012

JNIWrapper с его расширением winpack может делать то, что вы хотите.

Демо на сайте показывает его в действии.

person Allain Lalonde    schedule 28.01.2009

Вы можете принудительно свернуть свой графический интерфейс и .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, сообщите мне об этом!

person phil294    schedule 04.01.2015

Лучший способ сделать это:

if (!isFocused()) {
        setVisible(false);
        setVisible(true);
    }
person Viktor Kalinin    schedule 13.04.2016

Используя Swing как таковой, вы, скорее всего, не сможете; это особенность Widnows.

person Charlie Martin    schedule 28.01.2009
comment
А? Панель задач Windows по-прежнему специфична для Windows. - person Charlie Martin; 29.01.2009