【问题标题】:How to make a Shell to be always on top in SWT?如何使 Shell 在 SWT 中始终处于领先地位?
【发布时间】:2011-02-17 13:22:42
【问题描述】:

我想在我的应用程序中实现“始终在最前面”配置选项,该选项会立即生效。

我知道我可以用ON_TOP 风格调用Shell 构造函数。有没有办法在运行时做到这一点,即在 Shell 实例已经创建之后?

【问题讨论】:

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


    【解决方案1】:

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

    在 Carbon 中,您需要获取 shellHandle 实例变量,然后调用 OS.SetWindowGroup(shellHandle, OS.kFloatingWindowClass)。根据您的需要,您也许可以做这么多。

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

    【讨论】:

    • 这听起来很有希望,我会试一试
    【解决方案2】:

    在 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 目前对我没有任何问题。

    【讨论】:

      【解决方案3】:

      有一次我遇到了类似的问题,我发现了这样的帖子:

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

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

      【讨论】:

      • 谢谢,卢卡斯。我会试试看它是否有效。不过,我仍然需要 Mac 的解决方案。我会看看是否可以按照 Aaron 的建议从 SWT 源代码中找到任何内容。
      • 页面好像移到了eclipse.org/forums/index.php/m/323132。但是代码对我不起作用。
      【解决方案4】:

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

      您必须检查在创建期间执行了哪些代码,然后调用特定的本地方法(在类OS 中)。

      为您的平台下载 SWT 的源代码,看看它是如何工作的。这不是魔法,只是一点点手动调试。

      【讨论】:

        猜你喜欢
        • 2011-12-28
        • 2010-12-27
        • 1970-01-01
        • 1970-01-01
        • 2011-11-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-13
        相关资源
        最近更新 更多