任务栏托盘区图标在explorer.exe进程崩溃并自动重启后,如何随之再出现? 我写的一个程序在任务栏托盘区运行,但是在explorer.exe进程出错并自动重启后(explorer.exe进程出错后会自动重启其自身),我的程序在任务栏托盘区图标的就不见了,但是观察其它程序(如Winamp,qq,norton),其托盘区图标则会随explorer.exe的重新启动(不是重新启动机器)而出现。请高手指点! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 ★★我在网上找到这些资料,但不知如下在写在我的程序里★★相信很多Windows用户都碰到过这种情况:运行某个程序时出现意外错误,导致外壳程序Explorer.exe崩溃而发生重启(即Explorer.exe被关闭后重新运行),任务栏也在消失后重新生成,但应用程序在通知栏添加的图标消失了,虽然这些程序仍在运行,但再也无法通过通知栏图标与用户交互。为避免这种情况出现,Windows提供了相应的机制。在安装了Internet Explorer 4.0及以上版本的Windows操作系统中,当任务栏建立后,外壳会向所有顶层的应用程序发出通知消息,该消息是外壳以字符串“TaskbarCreated”为参数向系统注册获得的,应用程序窗口接收到该消息后就应该重新添加的通知栏图标。在Delphi中实现过程如下: initialization MsgTaskbarRestart := RegisterWindowMessage(‘TaskbarCreated’); 1. 重载主窗口的消息处理过程,拦截任务栏重建消息,进行重新添加图标的操作。 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参数,可以改变一个窗口的窗口过程。只需在创建控件时将应用程序窗口的窗口过程指针保存起来,并指向为控件中的某个新的窗口处理过程,在控件中就能够响应所有的窗口消息了(包括任务栏重建的消息);当控件销毁的时候再将保存的原始窗口过程指针恢复即可,此处不再赘述。 你是怎么创建的托盘???直接用的api,还是用的控件?不管你是怎么建的,收到这个消息后,删除原来的,重新建一次就可以了 我用API函数,怎么收到这个消息,在那个事件里面写 你的例子里不是写得很清楚么,在处理消息函数procedure WndProc(var Message: TMessage);中来处理。这个函数override祖先类中的函数。 急求:Delphi7.0如果删除Excel文档中的第一行? 表之间的数据操作? 请教:做出库单等主从表结构,到底用Grid录入好还是用DBGrid录入好呢? 想买服务器!!!!请各位老大给个建议!!! 请专家判别这是什么控件? 问一个ICS控件组的问题 用SQL语句创建ACCESS表???!!! 我这句SQL语句这样写对吗 300分求直接用API函数写的FTP客户端的程序的原代码 请问各位大虾,dxdbgrid怎样读取每一组的统计值,非常紧急,在线等!!! 在窗体间如何传递数组? 按顺序update数据库某字段的问题
相信很多Windows用户都碰到过这种情况:运行某个程序时出现意外错误,导致外壳程序Explorer.exe崩溃而发生重启(即Explorer.exe被关闭后重新运行),任务栏也在消失后重新生成,但应用程序在通知栏添加的图标消失了,虽然这些程序仍在运行,但再也无法通过通知栏图标与用户交互。为避免这种情况出现,Windows提供了相应的机制。在安装了Internet Explorer 4.0及以上版本的Windows操作系统中,当任务栏建立后,外壳会向所有顶层的应用程序发出通知消息,该消息是外壳以字符串“TaskbarCreated”为参数向系统注册获得的,应用程序窗口接收到该消息后就应该重新添加的通知栏图标。在Delphi中实现过程如下: initialization MsgTaskbarRestart := RegisterWindowMessage(‘TaskbarCreated’); 1. 重载主窗口的消息处理过程,拦截任务栏重建消息,进行重新添加图标的操作。 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参数,可以改变一个窗口的窗口过程。只需在创建控件时将应用程序窗口的窗口过程指针保存起来,并指向为控件中的某个新的窗口处理过程,在控件中就能够响应所有的窗口消息了(包括任务栏重建的消息);当控件销毁的时候再将保存的原始窗口过程指针恢复即可,此处不再赘述。