我想知道有人知道如何解决这个问题:
在我的 Java Eclipse 插件中,有些过程需要一些时间。因此,用户可能最小化窗口并让进程在后台运行。
现在,当进程完成时,我可以强制窗口再次回到顶部,但这在可用性方面是一个禁忌。我宁愿希望进程在任务栏中闪烁。有什么办法可以实现吗?
我看了一下 org.eclipse.jface.window但找不到类似的东西,SWT 文档也是如此......
我想到的另一件事 - 当人们在 mac os x 和 linux 上使用这个应用程序时,是否有一个独立于平台的解决方案 , 这将通知用户该过程已完成但不会将窗口置于顶部?
非常欢迎任何想法!
编辑:
我发现在 Windows 上,用户可以调整他是否愿意启用强制到前台。如果该选项被禁用,任务只会在任务栏中闪烁...
这里有个好read在那...
如果有人可能知道实现这种行为的某种独立于平台的方式,请与我分享您的知识!
最佳答案
我认为没有独立于平台的方法可以做到这一点。您将不得不查看特定于平台的 API 调用并通过 JNI 或 JNA 实现它们。
对于 Windows,这是我自己的一个应用程序的片段:
public static void flashWindow(final Shell shell, boolean flashTray,
boolean flashWindow) {
try {
if (isActiveWindow(shell)) {
flashWindow = false;
flashTray = false;
}
User32 lib = (User32) getLibrary("user32", User32.class);
User32.FLASHWINFO flash = new User32.FLASHWINFO();
flash.hWnd = new W32API.HANDLE(new W32API.UINT_PTR(shell.handle)
.toPointer());
flash.uCount = 2;
flash.dwTimeout = 1000;
if (flashTray || flashWindow) {
flash.dwFlags = (flashTray ? User32.FLASHW_TRAY : 0)
| (flashWindow ? User32.FLASHW_CAPTION : 0);
} else {
flash.dwFlags = User32.FLASHW_STOP;
}
flash.cbSize = flash.size();
if (lib.FlashWindowEx(flash) && !flashWindow) {
final FocusListener focusListener = new FocusListener() {
public void focusGained(FocusEvent arg0) {
flashWindow(shell, false, false);
shell.removeFocusListener(this);
}
public void focusLost(FocusEvent arg0) {
}
};
shell.addFocusListener(focusListener);
}
} catch (UnsatisfiedLinkError e) {
}
}
这是 getLibrary()
的简化版本:
protected static StdCallLibrary getLibrary(String libraryName,
Class<?> interfaceClass) throws UnsatisfiedLinkError {
try {
StdCallLibrary lib = (StdCallLibrary) Native.loadLibrary(libraryName,
interfaceClass);
return lib;
} catch (UnsatisfiedLinkError e) {
Logger.out.error("Could not load " + libraryName + " library.");
throw e;
}
}
当你用完它时,注意 dispose()
库。
关于java - 让 JFace 窗口在任务栏中闪烁或引起用户注意?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2773364/