Windows 通知区域中是否显示我的应用程序图标?

Is my application icon visible in the Windows notification area?

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

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

Shell_NotifyIconGetRect也没什么用,因为即使图标隐藏了,还是成功了,returns箭头图标的坐标

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

Using Shell_NotifyIconGetRect doesn’t help much, because even if the icon is hidden, it still succeeds and returns the coordinates of the arrow icon.

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

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

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函数returnsS_OK:

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