您的位置:首页 > 其它

开机自启动程序托盘图标显示不全

2012-04-17 16:46 666 查看
很多人都会碰到这个问题,这个问题的诡异之处是,它是间歇性的,所以人们网上各种搜索之后的各种答案尝试之后,也不会确定该方法是否真的有效。目前网上最流行的一个答案是:禁用SSDP Discovery和UPnP Device Host这两个服务。但是实际上,这是不行的。

找到MSDN:
http://msdn.microsoft.com/zh-cn/library/bb762159(en-us,VS.85).aspx
《处理 Shell_NotifyIcon 失败》一文中提到:在系统启动时调用Shell_NotifyIcon往往会失败。(比如你的程序在:HKLM\Software\Microsoft\Windows\CurrentVersion\Run 中)原因是这时系统忙于开启应用程序,这个错误在那些低配置或者加载了很多反病毒软件的机器上更为常见。不幸的是,你不能依赖 GetLastError 的返回值来发现这些错误。

当 Shell_NotifyIcon 返回 false 时, GetLastError 一些可能的返回值是:

ERROR_FILE_NOT_FOUND (2)

ERROR_TIMEOUT (1460)

ERROR_SUCCESS (0)

Shell_NotifyIcon 返回 false 时,最有效的的处理方法是等待一段时间,然后重试。

关于为何这个错误的 error code 会不一致,这里有 Paul Baker 的解释:
http://groups.google.com/group/microsoft.public.platformsdk.shell/msg/59235b293cbf5dfa http://groups.google.com/group/microsoft.public.platformsdk.shell/msg/73973287f15c03fc
Shell_NotifyIcon 实际上调用了 SetLastError(0),在最开始,

然后它应该是用 FindWindow 来寻找任务栏托盘,如果失败了,它会返回 ERROR_FILE_NOT_FOUND,

否则它会用 SendMessageTimeout 发送一个 WM_COPYDATA 消息到任务栏,超时时间只设置了 4 秒,

如果 SendMessageTimeout 返回 0, 那么 Shell_NotifyIcon 失败, 并且 GetLastError 返回 0。

所以要处理这个 Error ,需要用 API 当 Shell_NotifyIcon(NIM_ADD,&nid); 失败之后重试了。但是显然对于已经存在的程序,你是不能更改里面的Shell_NotifyIcon这些内容的,简而言之,目前为止,开机自启动程序托盘图标显示不全的问题是无法解决的。除非那些新编的程序使用上面提到的解决办法或者微软操作系统解决其自身问题。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: