托盘图标异常消失问题的分析与解决

        经测试发现,对于使用托盘图标的程序,托盘图标有时会出现如下的异常:

        (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 );
}
        对于第二种情况,具体的原因不明,也可以找到一种办法来规避掉:开启一个守护托盘图标的定时器,定时检测托盘图标是否存在,不存在则添加,相关代码如下:(只给出定时器消息响应函数的代码段)

void CXXDlg::OnTimer( UINT_PTR nIDEvent )
{
	if ( nIDEvent == 100 )
	{
		if ( !Shell_NotifyIcon( NIM_MODIFY, &m_nid ) )
			Shell_NotifyIcon( NIM_ADD, &m_nid );
	}

	CDialog::OnTimer(nIDEvent);
}


你可能感兴趣的:(shell,测试,任务)