小编典典

使JFace Window在任务栏中闪烁还是引起用户注意?

java

我不知道有人知道如何解决这个问题:

在我的Java Eclipse插件中,有些过程需要一些时间。因此,用户可能会 最小化窗口* 并使 进程在后台运行
现在,当 过程完成时 ,我可以强制窗口再次回到顶部,但这在可用性上是不行的。我希望该过程在 任务栏中 闪烁
。有什么办法可以做到这一点?
*

我看了一下
org.eclipse.jface.window
但找不到类似的东西,SWT文档也是如此…

我想到的另一件事-当人们也在 mac os xlinux 上使用此应用程序时,是否存在 平台无关的解决方案 ,该
解决方案 将通知用户该过程已完成,但没有弹出窗口?

任何想法都非常欢迎!

编辑:
我发现,在Windows上,用户可以调整他是否要启用向前景施加力。如果该选项被禁用,则任务将只是眨眼次数会在任务栏......
这里是一个很好的阅读上…

如果有人可能知道实现这种行为的某种独立于平台的方式,请与我分享您的知识!


阅读 238

收藏
2020-11-16

共1个答案

小编典典

我认为没有平台独立的方法可以做到这一点。您将必须查看特定于平台的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()完库后,请多加注意。

2020-11-16