如何获取SWT托盘或托盘项的位置

5
有什么方法可以使用SWT获取系统托盘(Tray)或其中的项目(TrayItem)的位置?从显示器获取边界只会给出整个屏幕的边界。即:
item.getDisplay().getBounds();

在我的Windows计算机上,这将给我 (0, 0, 1024, 1024)。

我还想知道系统托盘的位置(左、右、上、下),但是根据位置可以猜测。所有这些都是为了在系统托盘附近弹出消息

这是与此帖子相似,但我想提供一个悬赏(并因此控制我认为正确答案的内容)。


实现GUI测试并同时考虑托盘会非常不错。 - Daniel
问题:为什么你没有在提到的另一篇帖子上开始悬赏? - Sandman
它不让我这样做!我想我必须是所有者。 - Toby
真的吗?我以为任何问题都可以悬赏呢? - codejammer
5个回答

2
如果您只想在托盘项目附近显示一个shell,以响应用户事件(就像我的情况一样)。您可以在触发托盘项上的事件时获取指针位置:
trayItem.addSelectionListener (new SelectionListener () {
    @Override public void widgetDefaultSelected (SelectionEvent aEvent) {
        widgetSelected (aEvent);
    }

    @Override public void widgetSelected (SelectionEvent aEvent) {
        if (mWindow.isVisible ()) {
            Shell wnd = mWindow;
            mWindow = new Shell (mDisplay);
            wnd.close ();
        }
        else {
            mWindow.setLocation (mDisplay.getCursorLocation ());
            mWindow.open ();
        }
    }
});

您可以在这里找到整个源代码。

如果您想通知其他事件(不是由用户输入生成的),我猜最好的方法是像Sandman在之前的答案中指出的那样使用ToolTip。

祝您好运!


1

widget.getDisplay() 始终返回指定小部件所使用的显示器,因此这永远不会起作用。

就我看到的Win32和MacOS而言,在项本身的第一个鼠标事件之前,您将无法获得位置;-(

如果您愿意添加一些基于体系结构的代码,则可以尝试以下操作...

对于MacOS-尽管未经过测试:

  • 子类化 TrayItem(记得覆盖 checkSubClass()
  • 使用 getLocation() 返回项目的当前位置

对于Win32-再次未经过测试-您可以尝试相同的操作,但这次要覆盖 messageProc(...)。其中一个最初的消息将允许您查询句柄的当前位置...


谢谢,我会试一下。如果我创建托盘项时有一种记录位置的方法,并将其与item addData(...)或类似的内容相关联,怎么样?你认为有什么选择吗? - Toby
你最好看看是否可以以不同的方式访问相关信息,例如查找注册表... 上述解决方案不能保证在 SWT 的主要版本之间正常工作 :-( - Tonny Madsen
出了点状况,有什么建议从哪里开始吗?:S - Toby
抱歉,我完全没有任何想法 :-( - Tonny Madsen

0

您可以使用Display.map从一个坐标系映射到另一个坐标系。您可以通过以下方式将您的项目的0,0(左上角)映射到Display坐标:

Display.map(item, null, 0, 0)

在映射至显示坐标空间时,将 null 用作“to”控件。


这对于TrayItem无效,因为它没有子类化Control。 - dejuknow

0

从API来看,似乎没有这样的选项(与例如ToolItem相比)。:(


0

感谢那些尝试回答的人。然而,就像其他帖子一样,我认为这是不可能的,所以我否定了自己的问题 :(


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接