如何强制 Java swt 程序“将自身移动到前台”?

2022-09-03 06:18:55

目前使用swt,我有时希望程序任意地出现在前台(就像闹钟一样)。

通常以下作品(jruby):

@shell.setMinimized(false)
@shell.forceActive

如果外壳被最小化,这将使外壳排在最前面。

在任何时候创建新 shell 也会将(新 shell)放在最前面。

到目前为止,一切都很好,但是,如果shell没有最小化,上面的代码只是在任务栏中闪烁(闪烁)应用程序的图标。实际上,当你第一次运行它时,它会把它带到前面。之后,它只是在任务栏中闪烁。那是窗户。在Linux上,它似乎只在任务栏中闪烁(ubuntu默认)。

有没有人知道一种跨平台的方式,让应用程序在swt中脱颖而出?

似乎没有咒语的强制活动集活动设置最小化(假)设置焦点焦点焦点焦点和设置可见可以完成这件事。

我很确定这是可能的(至少在Windows中),就像E文本编辑器所做的那样。好吧,这不是swt,但至少已知其他一些应用程序可以做到这一点

我想也许这是swt错误192036

非常感谢。

相关:


答案 1

http://github.com/rdp/redcar/commit/d7dfeb8e77f13e5596b11df3027da236f23c83f0

显示了我是如何在Windows中做到这一点的(使用ffi)。

几个有用的技巧“可能”是

在BringToFront.SetForegroundWindow(wanted)调用之后添加一个“sleep 0.1”(希望这个实际上不是必需的)。

在将窗口置于前台添加shell.set_active。由于某种原因,forceActive 不会调用 setActive。

注意,setActive 执行 user32.dll BringWindowToTop 调用,并且需要在分离线程输入之前完成。

还要注意的是,如果您可以按照正确的顺序进行调用,则似乎根本不需要使用线程输入黑客(?)

http://betterlogic.com/roger/?p=2950

(包含一些关于如何实际做到这一点好提示)

在Linux上,forceActive确实有效 - 但只有在您移动到另一个窗口之前,它才会在任务栏中闪烁(仅)。猜测 swt 错误。[1]

还相关:

如何将窗户带到前面?

http://github.com/jarmo/win32screenshot/blob/master/lib/win32/screenshot/bitmap_maker.rb#L110“set_foreground”似乎适用于xp和Windows 7

[1] 需要在 Windows 和 https://bugs.eclipse.org/bugs/show_bug.cgi?id=303710 上将应用程序置于前台


答案 2

这在Windows 7和Ubuntu上对我有用:

private void bringToFront(final Shell shell) {
    shell.getDisplay().asyncExec(new Runnable() {
        public void run() {
            shell.forceActive();
        }
    });
}

推荐