在Windows 7任务栏中闪烁SWT窗口

时间:2014-12-01 16:13:55

标签: java swt blink

我有一个SWT窗口,我希望它在任务栏中最小化时可以闪烁。

我的一个朋友告诉我,我应该尝试激活(setActive())最小化的窗口然后它应该闪烁..但这不起作用..你有什么建议吗?

感谢您的帮助!

亲切的问候!

1 个答案:

答案 0 :(得分:0)

经过大量实验,我最终想出了自己的方法。如果外壳没有焦点,它甚至会在5次之后继续闪烁!

    public static final void flashTaskBar(Runnable code) {
        TaskItem item = getTaskBarItem();
        long startTime = System.currentTimeMillis();
        int state = item.getProgressState();
        int progress = item.getProgress();
        item.setProgressState(SWT.PAUSED);
        item.setProgress(100);
        boolean flashOn = true;
        int flashes = 0;
        int maxFlashes = 5;
        while(true) {
            long now = System.currentTimeMillis();
            if(now - startTime >= 500L) {
                startTime = now;
                item.setProgressState(flashOn ? SWT.DEFAULT : SWT.PAUSED);
                flashOn = !flashOn;
                if(!flashOn) {
                    flashes++;
                }
                if(flashes >= maxFlashes) {
                    item.setProgressState(state);
                    item.setProgress(progress);
                    return;
                }
            }
            if(code == null) {
                try {
                    Thread.sleep(10L);
                } catch(InterruptedException ignored) {
                    Thread.currentThread().interrupt();
                }
            } else {
                try {
                    code.run();
                } catch(Throwable e) {
                    e.printStackTrace();
                    item.setProgressState(state);
                    item.setProgress(progress);
                    return;
                }
            }
        }
    }

对于getTaskBarItem():

public static TaskItem getTaskBarItem() {
    TaskBar bar = display.getSystemTaskBar();
    if(bar == null) return null;
    TaskItem item = bar.getItem(shell);
    if(item == null) item = bar.getItem(null);
    return item;
}