经测试发现,对于使用托盘图标的程序,托盘图标有时会出现如下的异常:
(1)当资源管理器explorer.exe异常重启后,程序在任务栏的托盘图标会消失;
(2)在个别机器上出现托盘图标因不明原因消失,而此时程序依然在运行(任务管理器中能找到对应的进程)。
针对第一种情况,在explorer.exe异常重启时,会产生一个叫做TaskbarCreated的消息,可以在响应该消息时,将托盘图标加到托盘图标区域,以规避此种情况中出现的问题。相关代码如下所示:
UINT m_uMsgTaskbarRestart;
......
m_uMsgTaskbarRestart = RegisterWindowMessage(_T("TaskbarCreated")); \\ 注册这个消息,记录消息ID
......
LRESULT CXXDlg::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
if ( message == m_uMsgTaskbarRestart )
{
Shell_NotifyIcon( NIM_ADD, &m_nid);
}
return CDialog::DefWindowProc( message, wParam, lParam );
}
对于第二种情况,具体的原因不明,也可以找到一种办法来规避掉:开启一个守护托盘图标的定时器,定时检测托盘图标是否存在,不存在则添加,相关代码如下:(只给出定时器消息响应函数的代码段)