我编了一个程序,让系统右下角出现托盘图标,但是在运行后,当Explorer进程死了后,重新打开的时候,我的程序的图标就不见了,
有没有办法能在EXPLORER重新打开后图标依然存在(如天网的图标就一直是有的)???谢谢!!
有没有办法能在EXPLORER重新打开后图标依然存在(如天网的图标就一直是有的)???谢谢!!
解决方案 »
- 谁知道eDIY FTP Client组件在哪里下载
- 如何在DataGrid中输入数据并写入到数据库中,如何读取DataGrid的数据?
- 数据库连接在程序中突然中断,跪求高手进来看看
- 求一个能将图片上传到服务器的WEB控件的例子。
- 用VB如何实现在两台机之间传输文件。。。?
- 使用insert into xxx select xx 为什么会出现-2147467259 不能在手动或分布事务方式下创建新的连接。
- SQL SERVER中的raiserror, 与vb中的err.number ??
- 模拟聊天的算法,怎样实现
- 怎样才能点击dbgrid(true dbgrid)的网格标题,光标不变成那个下箭头,且不选择整列,就象点击listview的标题一样
- CorelDRAW中怎样画曲线上任意点的垂线
- msinet控件OpenURL方法响应时间太长,怎么回事?
- 如何判断我的机器目前在线?
监视Explorer
相信很多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参数,可以改变一个窗口的窗口过程。只需在创建控件时将应用程序窗口的窗口过程指针保存起来,并指向为控件中的某个新的窗口处理过程,在控件中就能够响应所有的窗口消息了(包括任务栏重建的消息);当控件销毁的时候再将保存的原始窗口过程指针恢复即可,此处不再赘述。