我写的一个程序在任务栏托盘区运行,但是在explorer.exe进程出错并自动重启后(explorer.exe进程出错后会自动重启其自身),我的程序在任务栏托盘区图标的就不见了,但是观察其它程序(如Winamp,qq,norton),其托盘区图标则会随explorer.exe的重新启动(不是重新启动机器)而出现。
请高手指点!

解决方案 »

  1.   

    ★★我在网上找到这些资料,但不知如下在写在我的程序里★★
    相信很多Windows用户都碰到过这种情况:运行某个程序时出现意外错误,导致外壳程序Explorer.exe崩溃而发生重启(即Explorer.exe被关闭后重新运行),任务栏也在消失后重新生成,但应用程序在通知栏添加的图标消失了,虽然这些程序仍在运行,但再也无法通过通知栏图标与用户交互。为避免这种情况出现,Windows提供了相应的机制。在安装了Internet Explorer 4.0及以上版本的Windows操作系统中,当任务栏建立后,外壳会向所有顶层的应用程序发出通知消息,该消息是外壳以字符串“TaskbarCreated”为参数向系统注册获得的,应用程序窗口接收到该消息后就应该重新添加的通知栏图标。在Delphi中实现过程如下:  initialization  MsgTaskbarRestart := RegisterWindowMessage(‘TaskbarCreated’); 1.        重载主窗口的消息处理过程,拦截任务栏重建消息,进行重新添加图标的操作。 procedure TMainForm.WndProc(var Message: TMessage);begin  ……  if Message.Msg = MsgTaskbarRestart then  begin    TrayIcon.Active := False;                  //删除通知栏图标    TrayIcon.Active := True;                      //添加通知栏图标  end;  ……  inherited WndProc(Message);end; //end of WndProc 值得一提的是,如果将自动恢复的功能封装为控件,将以后的开发带来方便。但由于外壳只向所有顶层的应用程序发送通知,封装起来有一定的困难。因为通知栏图标的回调函数只能接收WM_XBUTTONDOWN、WM_XBUTTONUP等有限的几个消息,并不能接收所有的窗口消息。解决的方法是使用SetWindowLong函数。通过向它传入GWL_WNDPROC参数,可以改变一个窗口的窗口过程。只需在创建控件时将应用程序窗口的窗口过程指针保存起来,并指向为控件中的某个新的窗口处理过程,在控件中就能够响应所有的窗口消息了(包括任务栏重建的消息);当控件销毁的时候再将保存的原始窗口过程指针恢复即可,此处不再赘述。
      

  2.   

    你是怎么创建的托盘???直接用的api,还是用的控件?不管你是怎么建的,收到这个消息后,删除原来的,重新建一次就可以了
      

  3.   

    我用API函数,怎么收到这个消息,在那个事件里面写
      

  4.   

    你的例子里不是写得很清楚么,在处理消息函数procedure WndProc(var Message: TMessage);中来处理。这个函数override祖先类中的函数。