【问题标题】:Blinking SWT Window in Windows 7 taskbar在 Windows 7 任务栏中闪烁 SWT 窗口
【发布时间】:2015-01-29 16:51:15
【问题描述】:

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

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

感谢您的帮助!

亲切的问候!

【问题讨论】:

  • Windows 不闪烁;你所描述的是窗口想要被激活的迹象。此行为由窗口控制,并可能受用户系统/设置的影响。明确你想要达到的目标。
  • 我想要你所说的那种行为:我想要激活窗口!但是当窗口最小化时我没有通过调用 setActive() 得到它。谢谢你的帮助!
  • 您的窗口很可能会以某种方式触发防止焦点窃取。很难找到关于如何 操作系统实现这一点的可靠资源——在 MS-Windows 上,这似乎是由注册表设置控制的 (technet.microsoft.com/en-us/library/cc957208.aspx)。可能没有什么可以完全由应用程序本身完成(除了可能将其设计为不经常弹出新的顶级窗口)。

标签: java swt blink


【解决方案1】:

经过多次试验,我最终想出了自己的方法。如果shell没有焦点,它甚至会在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;
}

【讨论】:

    猜你喜欢
    • 2010-09-07
    • 2011-07-04
    • 2022-11-09
    • 2011-08-03
    • 2011-10-31
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多