Shell_NotifyIcon NIF_INFO 不显示图标

Posted

技术标签:

【中文标题】Shell_NotifyIcon NIF_INFO 不显示图标【英文标题】:Shell_NotifyIcon NIF_INFO not showing icons 【发布时间】:2013-11-13 21:27:10 【问题描述】:

我首先遇到了气球的问题,他们根本拒绝展示,但发现了这个帖子:

Why aren't Shell_NotifyIcon balloon tips working?

然后将 cbSize 更改为 504,气球会显示,但其中没有图标,所有标准图标都不会显示,自定义图标也不会显示,结构如下所示:

 cbSize = 504
 hWnd = HDL
 uID = 10
 uFlags = NIF_INFO
 szInfo = sBody
 uTimeout = 20000
 szInfoTitle = sTitle
 dwInfoFlags = NIIF_ERROR

有人知道图标失败的原因吗? (已经尝试了各种组合中的所有结构尺寸和uVersion)

编辑:

S.cbSize = 504;
S.hWnd = HDL;
S.uID = 101;
S.uFlags = NIF_MESSAGE + NIF_ICON + NIF_TIP;
S.uCallbackMessage = 0x4DE;
S.hIcon = iHDL;
S.szTip = sTooltip;
S.uVersion = 3;
S.dwInfoFlags = NIIF_NONE;
Shell32.Shell_NotifyIconA(NIM_ADD,S:GetPointer())
Shell32.Shell_NotifyIconA(NIM_SETVERSION,S:GetPointer())

这用于创建托盘图标,并且确实如此:

所有回调消息都与更改工具提示/更改图标/设置焦点/删除托盘图标功能一起使用,在 XP 和 Win 8.1 上也按预期工作,所有使用 cbSize = 504 和 uVersion = 3 以及 Ansi NIM_SETVERSION 和 NOTIFYICONDATA,气球将显示它只是没有图标甚至不会显示默认图标:

S.cbSize = 504;
S.hWnd = HDL
S.uID = 101
S.uFlags = NIF_INFO
S.szInfo = sBody
S.uTimeout = 20000
S.szInfoTitle = sTitle
S.dwInfoFlags = NIIF_ERROR
Shell32.Shell_NotifyIconA(NIM_MODIFY,S:GetPointer())

使用 cbSize 的结构大小适用于除气球之外的所有内容,它们甚至不会显示,并且该大小报告为 688。

【问题讨论】:

【参考方案1】:

cbSize=504 仅在您使用Shell_NotifyIcon()NOTIFYICONDATA 的Ansi 版本、使用NOTIFYICONDATA 的XP (v3) 版本并且您的编译器的对齐设置实际上是对齐NOTIFYICONDATA 时才有意义字段正确,因此 XP 字段正好排成 504 个字节。如果根本看不到您的实际代码、编译器设置或任何上下文信息,就无法进一步解决您的问题。

【讨论】:

已编辑帖子,不知道您是否意识到这一点。

以上是关于Shell_NotifyIcon NIF_INFO 不显示图标的主要内容,如果未能解决你的问题,请参考以下文章

使用 win10toast 时出错:pywintypes.error: (-2147467259, 'Shell_NotifyIcon', 'Unspecified error')

Shell_NotifyIcon 在系统托盘中创建空白、无响应的图标

最小化托盘的实现方法

Windows 7 NotifyIcon GUID 欺骗保护

修改任务管理器中的应用程序图标,而不是系统托盘中的应用程序图标

delphi在窗口最小化时不在任务栏