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