【问题标题】:Is my application icon visible in the Windows notification area?我的应用程序图标在 Windows 通知区域中是否可见?
【发布时间】:2020-10-01 14:57:49
【问题描述】:

我的软件有一个通知图标。默认情况下,Windows 会隐藏非活动图标。当用户关闭我的应用程序时,我想通知他们,该应用程序在后台仍然处于活动状态,他们可以通过隐藏通知区域中的图标访问它。

如果图标确实不可见,我想仅显示此消息

使用Shell_NotifyIconGetRect并没有多大帮助,因为即使图标被隐藏,它仍然成功并返回箭头图标的坐标。

有没有其他方法可以确定我的通知图标当前是否可见? 或者,有没有办法找出箭头图标的坐标——然后我可以将它们与我寻找图标的坐标进行比较。或者至少有一种方法可以确定是否显示了箭头图标(这将有助于我使用后备解决方案)。

【问题讨论】:

  • 不要尝试这样做。与系统合作,而不是反对它。
  • 虽然它可能不是您想要的,但您可以使用 UI 自动化确定箭头是否存在。相应的自动化元素称为“Notification Chevron”。这里有一个关于如何做这种事情的示例:devblogs.microsoft.com/oldnewthing/20141013-00/?p=43863
  • David,我只是想创建一个用户友好的应用程序。只要 MS 没有为此用例提供适当的官方解决方案,我就没有更好的方法。不知道,什么困扰你。 @Simon Mourier 谢谢,这可能会帮助我找到一个备用解决方案。
  • 我想使用这个条件来不打扰手动将图标移动到可见区域的用户以及所有图标都可见(通过任务栏属性或组策略)的用户。如果启用了自动隐藏(默认),该图标将在应用程序使用期间几秒钟后消失。
  • 用户有这么多不同类型,恐怕你的一般假设几乎没有触及现实。我见过用户用手指点击屏幕,因为他们忘记了他们的设备没有触摸屏。所以,是的,就是这样。即使作为一个更有经验的用户,我也希望在新应用程序最小化为通知图标时收到通知。您可能会有不同的看法,但最后我只是寻求帮助,为我希望在我的软件中具有的功能找到解决方案。

标签: windows winapi taskbar notification-area


【解决方案1】:

使用Shell_NotifyIconGetRect并没有多大帮助,因为即使图标被隐藏,它仍然成功并返回箭头图标的坐标。

我测试后的结果不是这样的。

我创建了一个示例并使用了以下代码:

static NOTIFYICONDATA nid;
static NOTIFYICONIDENTIFIER niif;
case WM_CREATE:
{
    nid.cbSize = sizeof(NOTIFYICONDATA);
    nid.hWnd = hwnd;
    nid.uID = 1001;
    nid.uCallbackMessage = WM_MYMESSAGE;
    nid.hIcon = LoadIcon(NULL, IDI_QUESTION);
    strcpy(nid.szTip, "Test Tool");
    nid.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP;
    nid.dwStateMask = NIS_HIDDEN;
    size_t nidszTipLength = sizeof(nid.szTip) / sizeof(nid.szTip[0]);
    Shell_NotifyIcon(NIM_ADD, &nid);
    niif.cbSize = sizeof NOTIFYICONIDENTIFIER;
    niif.hWnd = nid.hWnd;
    niif.uID = nid.uID;
    niif.guidItem = GUID_NULL;
    return 0;
}

然后我使用 Shell_NotifyIconGetRect 来获取图标的坐标:

RECT rc;
HRESULT hr = Shell_NotifyIconGetRect(&niif, &rc);

当图标在隐藏区域时:

当我修改它的位置时:

可以看出,即使在隐藏区域,也可以通过Shell_NotifyIconGetRect函数获取图标的坐标。

同样,我测试了不在隐藏区域的情况:

可以发现图标的大小和坐标发生了变化,可以根据它们判断图标是否在隐藏区域。

编辑:

隐藏区域关闭时:

如果通知区域显示图标,Shell_NotifyIconGetRect函数返回S_OK

如果图标在通知区域的隐藏区域,函数返回S_FALSE

【讨论】:

  • 那么,当图标实际上被隐藏时,你的结果是什么? (在隐藏区域且隐藏区域关闭)
  • @CodeX 我的答案更新了,可以参考一下。
  • 你似乎是对的!虽然 rc 包含箭头的坐标,但实际结果确实是 1 而不是 0。我有点困惑,因为几年前我在另一个项目中使用过这个函数,我的结果是,这个函数甚至成功了如果图标被隐藏。我不知道我当时是不是弄错了,或者他们是否改变了功能,但它肯定会解决我的问题!稍后我将使用旧的 Win10 虚拟机和 Win7 进行测试,看看是否有区别并让您知道。
  • 作为一个小补充,这个帖子中的人遇到了和我一样的问题(当时):social.msdn.microsoft.com/Forums/windowsdesktop/en-US/…
  • 不再拥有我的旧 Win10-VM,但在 Win7 中它的工作方式与在最新 Win10 版本中的工作方式相同。显然,我只关注结果坐标(如果图标隐藏,则返回箭头矩形)而不是 HRESULT 值,它告诉您是否找到了图标,正如您在更新中正确说明的那样。非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-14
  • 1970-01-01
  • 1970-01-01
  • 2015-06-18
  • 1970-01-01
相关资源
最近更新 更多