【问题标题】:How can I flash the Windows taskbar using Swing?如何使用 Swing 刷新 Windows 任务栏?
【发布时间】:2009-01-28 20:44:40
【问题描述】:

我正在开发一个 Swing 应用程序,我需要刷新 Windows 任务栏。我不能使用frame.requestFocus(),因为我不想从任何其他应用程序中窃取焦点。

【问题讨论】:

    标签: java swing taskbar


    【解决方案1】:

    我不知道它是否适用于较新版本的 Windows,但 .toFront() 方法用于在当前 VM 的窗口都不在前台时刷新窗口。

    这意味着在最小化的框架上调用 frame.toFront() 总是会使其闪烁...

    【讨论】:

    • 这种方法有一个缺点。例如,如果用户在应用程序中输入 JTextArea,则此功能会移除焦点并中断输入。
    【解决方案2】:

    JNIWrapper with its winpack extension 可以为所欲为。

    网站上的演示展示了它的实际效果。

    【讨论】:

      【解决方案3】:

      您可以强制最小化您的 GUI 和.toFront-zh:

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

      遗憾的是,这会将焦点从活动窗口中移除。您可以找出活动窗口并在之后重新激活它。但是,闪烁只会持续大约三秒钟。

      ...或者通过在FlashWindow 上使用DLL 调用来了解问题的真正根源。使用干净的 Java 代码无法调用 dll,您将需要其他编程语言的帮助,例如与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 中访问它(互联网上有如何做到这一点的指南),因此不需要任何外部 exe 文件。

      如果在windows任务栏实现闪现还有问题,请告诉我!

      【讨论】:

        【解决方案4】:

        最好的方法:

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

        【讨论】:

          【解决方案5】:

          使用 Swing 本身,你很可能不能;那是 Windows 特有的东西。

          【讨论】:

          • 呃,还有? Windows 任务栏仍然是特定于 Windows 的。
          猜你喜欢
          • 2011-01-09
          • 1970-01-01
          • 2016-05-15
          • 1970-01-01
          • 2022-01-12
          • 1970-01-01
          • 1970-01-01
          • 2011-03-24
          • 1970-01-01
          相关资源
          最近更新 更多