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

    很多人都会碰到这个问题,这个问题的诡异之处是,它是间歇性的,所以人们网上各种搜索之后的各种答案尝试之后,也不会确定该方法是否真的有效。目前网上最流行的一个答案是:禁用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这些内容的,简而言之,目前为止,开机自启动程序托盘图标显示不全的问题是无法解决的。除非那些新编的程序使用上面提到的解决办法或者微软操作系统解决其自身问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值