【问题标题】:How to find the location of the icon in the system tray如何在系统托盘中找到图标的位置
【发布时间】:2008-11-07 17:10:09
【问题描述】:

我有一个出现在系统托盘中的 NotifyIcon 控件。如何在屏幕上找到图标的位置 (x, y)?

谢谢

【问题讨论】:

    标签: c# winforms visual-studio-2008 notifyicon


    【解决方案1】:

    实际上你可以做到这一点,这里的代码向你展示了如何以及更多。

    在来自 NotifyIcon 的任何鼠标事件中,只需查看 Control.MousePosition,它包含鼠标的 (x,y)。可以使用这些 (x,y) 值将 ContextMenu 准确定位在表单/控件上单击表单/控件的位置。

    这里有一个很好的例子:

    更多:http://code.msdn.microsoft.com/TheNotifyIconExample

    【讨论】:

      【解决方案2】:

      经过漫长的试错之旅,以及我自己的通知图标定位器的开发,我开发了一种找到最佳位置图标的方法,到目前为止一切顺利,直到我看到@zhwang SuperNotifyIcon这个惊人的项目.本项目提供了三种定位通知图标的方式,从不准确的(像我自己开发的)到使用Windows 7中的new API。这是确定的答案。

      【讨论】:

        【解决方案3】:

        你不能。获取系统托盘的窗口句柄并不难,GetClassName()返回“ToolbarWindow32”,标准TOOLBAR公共控件的类名。请注意,64 位操作系统有两个。然后你可以像 TB_GETBUTTONINFO 一样向它发送消息。主要问题是您不知道选择哪个按钮 ID,并且返回的信息不包括按钮位置。

        更好的是,按钮在你无法锁定的情况下移动。

        【讨论】:

        • github.com/rzhw/SuperNotifyIcon 显然是这样做的。我知道在回答这个问题时它可能没有曝光 - 但它通过本地调用完成任务,就像你说的那样是不可能的 - 这适用于旧版本的 Windows。它也可以通过新的 Windows 7 API 做到这一点。 “我认为你做不到”会比“你做不到”更好——这有点牵强。
        • 感谢作者忽略了我帖子的最后一句话。通过将代码放在 Deprecated 文件夹中并使用诸如“Here be dragons”之类的 cmets,他确实很清楚地说明了这一点。您可以忽略该建议,也可以对其投反对票,但这些建议并不方便无效。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-11
        • 1970-01-01
        • 2011-06-25
        • 1970-01-01
        • 1970-01-01
        • 2016-08-22
        相关资源
        最近更新 更多