如何使用Swing刷新Windows任务栏?

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

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

这意味着在最小化的帧上调用frame.toFront()总是会使它闪烁…

JNIWrapper及其winpack扩展可以做你想要的。

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

你可以强制最小化你的GUI和.toFront它:

  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 FlashWindow来了解问题的真正根源。 使用干净的Java代码无法调用dll,您需要其他编程语言的帮助,例如使用JNA 。 除此之外,您还可以使用其他语言编写自己的程序,并从Java应用程序中调用它。 我将在下面的AutoHotkey中给出一个示例:

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中访问它(有关于如何在Internet上执行此操作的指南),因此不需要任何外部exe文件。

如果您仍然无法在Windows任务栏中实现闪烁,请告诉我们!

最好的方法是:

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

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