你如何强制java swt程序"移动到前台"?

rog*_*ack 16 java shell user-interface swt foreground

目前有了swt,我有时想要一个程序随意地走到前台(就像闹钟一样).

通常以下作品(jruby):

@shell.setMinimized(false)
@shell.forceActive
Run Code Online (Sandbox Code Playgroud)

如果它被最小化,它会将壳体带到前面.

随时创建一个新shell也会将(新shell)带到前面.

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

有人知道一个跨平台的方式让应用程序来到前面,在swt?

似乎没有任何forceActive的setActive setMinimized(false)setFocus forceFocus和setVisible都可以完成这件事.

我很确定它是可能的(至少在Windows中),就像E文本编辑器那样.嗯,这不是swt,但至少其他一些应用程序已经知道这样做.

我想也许这是swt bug 192036

非常感谢.

有关:

rog*_*ack 6

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

显示我是如何在Windows中完成的(无论如何)(使用ffi).

一些有用的技巧"可能"

在BringToFront.SetForegroundWindow(想要)调用之后添加'sleep 0.1'(希望实际上不需要这个).

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

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

另请注意,如果您可以按正确的顺序进行调用,则可能根本不需要使用线程输入hack(?)

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

(包含几个关于如何正确执行此操作的好提示)

在Linux上,forceActive 确实有效 - 但只有在你移动到另外几个窗口之后,它才会在那之后(仅)在任务栏中闪烁.猜swt bug.[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


小智 6

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

private void bringToFront(final Shell shell) {
    shell.getDisplay().asyncExec(new Runnable() {
        public void run() {
            shell.forceActive();
        }
    });
}
Run Code Online (Sandbox Code Playgroud)