我编了一个程序,让系统右下角出现托盘图标,但是在运行后,当Explorer进程死了后,重新打开的时候,我的程序的图标就不见了,
有没有办法能在EXPLORER重新打开后图标依然存在(如天网的图标就一直是有的)???谢谢!!

解决方案 »

  1.   

    我的实现方法...
    监视Explorer
      

  2.   

    定时刷新任务栏图标,或者监视Explorer
      

  3.   

    Explorer.exe崩溃后自动重启任务栏托盘区图标  [作者:轻舞肥羊    转贴自:Delphibbs.com    点击数:137    更新时间:2004-12-25    文章录入:aleyn] 
     
    相信很多Windows用户都碰到过这种情况:运行某个程序时出现意外错误,导致外壳程序Explorer.exe崩溃而发生重启(即Explorer.exe被关闭后重新运行),任务栏也在消失后重新生成,但应用程序在通知栏添加的图标消失了,虽然这些程序仍在运行,但再也无法通过通知栏图标与用户交互。为避免这种情况出现,Windows提供了相应的机制。在安装了Internet Explorer 4.0及以上版本的Windows操作系统中,当任务栏建立后,外壳会向所有顶层的应用程序发出通知消息,该消息是外壳以字符串“TaskbarCreated”为参数向系统注册获得的,应用程序窗口接收到该消息后就应该重新添加的通知栏图标。在Delphi中实现过程如下: 
    initialization
      MsgTaskbarRestart := RegisterWindowMessage(‘TaskbarCreated’);//重载主窗口的消息处理过程,拦截任务栏重建消息,进行重新添加图标的操作。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参数,可以改变一个窗口的窗口过程。只需在创建控件时将应用程序窗口的窗口过程指针保存起来,并指向为控件中的某个新的窗口处理过程,在控件中就能够响应所有的窗口消息了(包括任务栏重建的消息);当控件销毁的时候再将保存的原始窗口过程指针恢复即可,此处不再赘述。