如何使Shell在SWT中始终处于领先地位?

时间:2010-05-10 07:06:21

标签: java windows macos swt always-on-top

我想在我的应用程序中实现“Always on top”配置选项,该选项立即生效。

我知道我可以使用Shell样式调用ON_TOP构造函数。有没有办法在运行时执行此操作,即在已创建Shell实例之后?

4 个答案:

答案 0 :(得分:3)

在Cocoa中,您需要使用反射来获取Shell实例变量window,然后调用window.setLevel(OS.NSStatusWindowLevel)

在Carbon中,您需要获取shellHandle实例变量,然后调用OS.SetWindowGroup(shellHandle, OS.kFloatingWindowClass)。根据您的需要,您可能能够做到这一点。

在任何一种情况下,您还应该强制将SWT.ON_TOP位添加到style字段。特别是在Carbon中,很多东西都依赖于那个位置。

答案 1 :(得分:3)

在Windows上,您可以这样做:

private static final void toggleAlwaysOnTop(Shell shell, boolean isOnTop){
    long handle = shell.handle;
    Point location = shell.getLocation();
    Point dimension = shell.getSize();
    OS.SetWindowPos(handle, isOnTop ? OS.HWND_TOPMOST : OS.HWND_NOTOPMOST,location.x, location.y, dimension.x, dimension.y, 0);
}

所有这些api都是公开的,所以不需要反思。

SetWindowPos的最后一个参数与Shell.getStyle()不同。将它保留为0目前对我没有任何问题。

答案 2 :(得分:1)

有一次我有类似的问题,我找到了这样的线程:

http://dev.eclipse.org/newslists/news.eclipse.platform.swt/msg11143.html

不幸的是我不记得它是否有效......

答案 3 :(得分:1)

在创建小部件后,没有标准的方法来更改小部件的样式。

您必须检查在创建时间内执行的代码,然后调用特定的本机方法(在类OS中)。

下载适用于您平台的SWT源代码,了解其工作原理。这不是魔术,只是一些手动调试。