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

本文介绍了一个TantTaskbarIcon控件的问题,即在Explorer.exe崩溃后无法重新创建任务栏图标。通过注册TaskbarCreated消息并适当处理,确保了任务栏图标即使在Explorer重启后仍能正确显示。

一直在用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下编译过多个程序。原来的程序不能再添加图标,重新编译过后就可以了。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值