托盘图标程序的寄生宿主Taskbar与Explorer.exe的关系

  • A+
所属分类:[开发技巧]

1、Explorer.exe加载后,创建了状态条taskbar,而taskbar的trayicon当然是taskbar的一部分。
2、Explorer.exe出现问题后,taskbar当然也会down掉!

所以,本文就是解决当explorer.exe重新加载的时候,你如何把自己的图标再显示出来!

不存在此问题的控件是CoolTrayIcon。本文也是同样的原理实现的,不过,cooltrayicon使用的响应消息方法与我的不同!

原理:当Explorer.exe加载后,会创建状态条,此时状态条会向所有顶层窗口发送一个状态条已创建的消息。这样,你的程序就可以响应此消息来重建trayicon了!

那么状态条回发送什么消息呢?

别的我不知道,但只知道最需要的——它会发送一个系统唯一标识的“字符串消息”,"TaskbarCreated"。
这样,在我们的程序中只要注册一个系统消息,并且在收到这个消息时响应他就好了!
思路如下:
1、在窗体创建的时候,注册这个消息!
2、重载(override)tcurtomform的wndproc这个过程
3、再wndproc这个过程里响应自己注册的这个消息!重建我们的trayicon了。
const yourbackmessageconst= WM_User+2005;

type
TForm1= class(TForm)
...
procedure FormCreate(Sender : TObject);
...
...
protected //仍然声明为保护成员
procedure WndProc(var Message: TMessage);override;
...
end;
var
WM_TASKBARCreateD: cardinal;
...
...
//实现部分
procedure TForm1.FormCreate(Sender: TObject);
begin
WM_TASKBARCreateD:= RegisterWindowMessage('TaskbarCreated');
//注册这个字符串消息,当收到这个消息时,我们窗体内部使用 WM_TASKBARCreateD,来响应
end;
procedure TForm1.WndProc(var Message: TMessage);
begin
if Message.Msg= WM_TASKBARCreateD then
CreateTrayIcon;//创建我们的托盘图标,很多资料里都有,略.
inherited WndProc(Message);
end;

  • 我的微信
  • 这是我的微信扫一扫
  • weinxin
  • 我的微信公众号
  • 我的微信公众号扫一扫
  • weinxin
广告也精彩
avatar
广告也精彩

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: