explorer.exe崩溃后恢复托盘图标

今天遇到一个编程上的问题,程序需要用到托盘图标,但是图标有时会莫名其妙从托盘上消失,但在任务管理器中查看该进程却是存在的,因为程序没有加快捷键,所以该程序的窗口没有办法再唤出来,只有从任务管理器里杀死再重启。测试部认为这是一个非常大的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); 
}

你可能感兴趣的:(编程,windows,qq,测试,IE,任务)