TantTaskbarIcon控件 在Explorer.exe 崩溃后重新添加Taskbar Icon的问题

一直在用TantTaskbarIcon,从Delphi5- Delphi6。用起来很方便,拖个控件,再指定一个 ImageList,就可以做到TrayIcon 动画的效果了。

但是TantTaskbarIcon在Explorer.exe崩溃后,没有再重新创建图标。如果做一个在任务栏隐藏的程序,而把所有菜单集中到图标上,那么一旦图标不见了,任务就没办法再到用户交互了。只能到任务管理器里去强行关闭,很不方便。

google到在Explorer崩溃后,任务栏会重新创建,会向顶层窗口广播 TaskbarCreated 消息,只要向系统注册这个消息,再在 WndProc里处理这个消息时重新向任务栏添加图标就可以了。

修改这个控件代码,在末尾增加:

initialization
  MsgTaskbarRestart:= RegisterWindowMessage('TaskbarCreated'); //向系统注册消息
向系统注册这个消息。

在 Implementation 节后增加变量:
var
  MsgTaskbarRestart:UINT;  //注册任务栏创建消息

这样就可以在任务栏重建时得到消息了。

然后在 Procedure TantTaskbarIcon.WndProc(Var Message: TMessage); 中增加消息处理:

     if (Msg = MsgTaskbarRestart) then
      begin  
        DeleteFromTaskbar();  //删除图标。要先删除再增加,否则可能出现两个图标。
        AddToTaskbar(); //增加图标  
      end;  
注意以上代码加在   if (Msg = WM_TaskbarIconCallBack) and fEnabled then 前面。不过加在后面应该也没有关系。

重新编译控件,安装。

再重新编译应用程序,在托盘图标出现后,从任务管理器中关闭 Explorer.exe 进程,再运行时可以发现,图标还在。

按一些资料的说法,处理消息所在的 WndProc必须是顶层窗口,如果是控件,就要用 SetWindowLong 来修改顶层窗口的过程。这里并没有做这样的修改,但是也能用,就懒得去深究了。

在Windows XP sp2, delphi6下编译过多个程序。原来的程序不能再添加图标,重新编译过后就可以了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值