【问题标题】:Determining location of tray icon确定托盘图标的位置
【发布时间】:2011-05-20 23:14:58
【问题描述】:

我的应用程序设计为位于系统托盘中,其行为类似于 Windows 7 中的网络/音量/电源/操作中心托盘项(以及 Windows Vista 中的等效项)。即点击托盘图标时可见,失去焦点时隐藏。

该应用程序是用 WPF 编写的,但我目前正在使用 WinForms 中的 NotifyIcon 作为托盘图标。

我想知道是否有人对我如何确定应用程序托盘图标的位置(即屏幕坐标)有任何建议。默认的 Windows Vista/7 托盘项目有一些方法可以做到这一点,因为弹出窗口在相关托盘图标上方居中对齐。

在 Vista 中这不是什么大问题:我将应用程序永久设置在右下角,这看起来不错(尽管没有包含任务栏未放置在底部的情况的逻辑屏幕)。但是,在 Windows 7 中,我的应用程序最终会遮挡新的系统托盘弹出框,而不是像音量控制等那样悬停在其上方。

到目前为止,我在搜索中看到的最佳解决方案是处理 NotifyIcon 上的鼠标向上事件,并使用鼠标坐标来确定图标的位置。我想我最终会使用这种方法,除非有人有更好的主意,但它并不理想,因为位置会根据用户点击图标的位置而略有不同。

【问题讨论】:

    标签: wpf position coordinates system-tray notifyicon


    【解决方案1】:

    Windows 7 及更高版本公开了Shell_NotifyIconGetRect() 函数,该函数返回图标边界矩形的屏幕坐标。

    不过,您需要为其提供通知图标 GUID,我不知道您是否可以通过托管的 NotifyIcon 类访问该属性。

    【讨论】:

    • 非常感谢 :) 我会看看是否可以使用 NotifyIcon 并报告。
    • 我有 Shell_NotifyIconGetRect() 函数与 WinForms NotifyIcon 类一起使用。我在博客文章中记录了这个过程:blog.quppa.net/?p=17
    【解决方案2】:

    除此之外,我还写了一个在 Shell_NotifyIconGetRect 函数不可用时查找通知图标位置的方法:http://blog.quppa.net/2010/12/28/windows-7-style-notification-area-applications-in-wpf-part-6-notify-icon-position-pre-windows-7/

    【讨论】:

    • 谢谢。这个仅适用于较旧的 Windows 吗?我的意思是它适用于较新的版本(Win 7,8)吗?
    • 我强烈建议在 Windows 7 及更高版本中使用 Shell_NotifyIconGetRect 函数,但我在此处描述的方法应该仍然适用于较新版本的 Windows。但是,它不会在弹出框中找到该位置。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-04
    • 1970-01-01
    相关资源
    最近更新 更多