托盘图标莫名其妙消失问题的解决办法

天网防火墙右下角图标消失及解决方法尝试:
有许多朋友发贴,天网防火墙在系统托盘处(右下角)的图标消失。本人作了些试验,发现在使用windows优化大师的系统医生时,会将破解版的天网防火墙启动加载认作无效。另一种消失的情况是隐蔵了不活动图标。解决方法请试一下,在关机前如果使用windows优化大师作系统清理的,点击天网防火墙图标,执行系统设置的向导,设置“开机时自动启动天网防火墙”。如果是隐藏了图标的,只要设为显示即可。还有一种是中了木马,阻制了天网防火墙的启动,可以用KVDOS.exe在DOS状态下杀毒试试。

屋外的红砖墙 发表于 2006-6-20 16:54:00 20060620

今天遇到一个编程上的问题,程序需要用到托盘图标,但是图标有时会莫名其妙从托盘上消失,但在任务管理器中查看该进程却是存在的,因为程序没有加快捷键,所以该程序的窗口没有办法再唤出来,只有从任务管理器里杀死再重启。测试部认为这是一个非常大的bug,将等级定在五个星。下午在网上查了很久资料,看到csdn上有讲,这是因为explorer.exe的崩溃造成的,当explorer.exe崩溃后,它会再次重新启动,重新启动后,它会重绘桌面、开始菜单、任务栏。如果任务栏的托盘程序处理了操作系统发来的TaskbarCreated消息,自己重新绘制的话,托盘上的图标会再次出现。就像msn一样,但QQ却不会,如果explorer.exe崩溃了,QQ在托盘上是看不到的,但因为它有快捷键,所以还是能对它进行操作的。

上面是具体问题的描述,下面来说说解决的办法。我用的是vc++6.0编的程序,所以这里也只说vc的解决方法,首先要定义一个Windows系统消息,const UINT WM_ADDICON_TOTASKBAR = ::RegisterWindowMessage(_T("TaskbarCreated"));这个消息即是explorer.exe重绘任务栏时发给程序的消息。再将该消息加入宏映射表,
ON_REGISTERED_MESSAGE(WM_ADDICON_TOTASKBAR, OnAddIconToTaskbar)
需要注意的是,这里用的是REGISTERED_MESSAGE,如果这里写得不对,也是不行的。然后要定义消息处理的函数,这里的函数定义也需要注意要定义成类似afx_msg LRESULT OnAddIconToTaskbar(WPARAM wParam, LPARAM lParam),这里如果不写成LRESULT而写成void,编绎可能通不过。而且如果不加WAPARAM和LPARAM编绎也可能通不过。

最后需要说明的是,在这个OnAddIconToTaskbar函数里面,需要重新做一次往托盘添加图标的过程。 
  
  
  防止托盘区图标无故消失
NowCan 
很多细心的用户都会发现,由于Explorer.exe出错常常导致自己放到托盘区的图标无故消失,而程序仍然在运行的情况。导致这种现象的原因是你的程序考虑不够周到。其实这个现象是完全可以避免的,下面将详细讲述解决方案。
    先说明一下出现这个现象的原因。当Explorer.exe出错重启时,任务栏(包括托盘区)将重建,而此时应用程序必须自己将图标放到托盘区去,否则该图标就会消失。虽然这是一种异常情况,但一个优秀的应用程序还是应该考虑到这种异常的。
    由上述原因可知,只要能够在任务栏重建时能够得到通知就可以解决这个问题了。幸运的是,如果你的计算机安装了IE4以上版本(这个大家应该都有吧)就可以得到通知了,当任务栏建立的时候,系统会以“TaskbarCreated”注册一个全局消息,并广播这个消息。这样我们只要在应用程序里也以“TaskbarCreated”注册一个消息,当收到这个消息的时候,我们就知道任务栏已经重建,应该画图标了。
    程序就比较简单了,这里只写一个示例代码。用SDK写的,如果用VCL,可以重载一下WindowProc。
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMessage, WPARAM wParam, 
    LPARAM lParam)
{
static UINT s_uTaskbarRestart;

switch(uMessage)
    {
    case WM_CREATE:
        s_uTaskbarRestart = RegisterWindowMessage(TEXT("TaskbarCreated"));
        break;
        
    default:
        if(uMessage == s_uTaskbarRestart)
            AddTaskbarIcons();//这个就是往托盘区画图标的函数,需要自己写。
        break;
    }
return DefWindowProc(hWnd, uMessage, wParam, lParam);
}

你可能感兴趣的:(VC开发)