Frage

Ich entwickle eine Swing-Anwendung, und ich muss die Windows-Taskleiste blinken. Ich kann nicht frame.requestFocus() verwenden, weil ich nicht will den Fokus von einer anderen Anwendung stehlen.

War es hilfreich?

Lösung

Ich weiß nicht, ob es auf neuere Versionen von Windows gilt, aber der .toFront () -Methode verwendet, um das Fenster, wenn keines der aktuellen VM Fenster waren in dem Vordergrund zu blinken.

Das bedeutet, dass frame.toFront () auf einem minimierten Rahmen Aufruf immer es würde blinken ...

Andere Tipps

JNIWrapper mit seiner WinPack Erweiterung können tun, was Sie wollen.

Die Demo auf der Website zeigt sie in Aktion.

Sie können entweder kraft minimieren Sie Ihre GUI und .toFront-en es:

        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!!

, die leider wird entfernen Sie den Fokus aus dem aktiven Fenster. Sie könnten das aktive Fenster herausfinden und danach wieder aktivieren. Aber dennoch wird das Blinken nur für etwa drei Sekunden dauern.

... oder sich bis auf die wirklich Kern der Sache durch eine DLL mit -Aufruf auf FlashWindow. Der Aufruf dlls ist nicht möglich mit sauberem Java-Code, werden Sie die Hilfe von anderen Programmiersprachen benötigen, möglich, beispielsweise mit JNA . Abgesehen davon, können Sie auch Ihr eigenes Programm in einer anderen Sprache schreiben und es aus Ihrer Java-Anwendung aufrufen. Ich werde ein Beispiel in AutoHotkey unten geben:

AutoHotkey Code:

    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)

in eine Datei kompiliert genannt flash.exe, gesetzt in Ihre Java-Arbeitsverzeichnis, können Sie es nennen von jeder Funktion:

    Runtime.getRuntime().exec("./flash.exe \"" + MyJFrame.getTitle() + "\"");

Alternativ könnte man die AutoHotkey.dll nutzen und den Zugang innerhalb des Javacode (es gibt Führungen, wie es auf dem Internet zu tun), so gäbe es keine Notwendigkeit für externe exe-Dateien sein.

Wenn Sie immer noch Probleme haben, das Blinken in der Windows-Taskleiste zu erreichen, lassen Sie es mich wissen!

Der beste Weg, dies zu tun:

if (!isFocused()) {
        setVisible(false);
        setVisible(true);
    }

Mit Swing-per se, Sie sehr wahrscheinlich nicht können; das ist eine Windows-spezifische Sache.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top