我的一个用到托盘图标的程序,有时退出时,Icon也不消失 ( 积分: 100 )

  • 主题发起人 主题发起人 bobby_ym
  • 开始时间 开始时间
B

bobby_ym

Unregistered / Unconfirmed
GUEST, unregistred user!
我的一个用到托盘图标的程序,程序退出时,Icon也不消失,
拿鼠标在Icon上晃几下,Icon就消失了?
有什么解决方法吗?
 
你程序退出的是时候是直接在delphi中运行的还是直接点exe文件运行的,前者的话不会消失的,后者的话应该会消失的
 
在窗体的onclose里调用 NotifyIcon.Visible = false;
看看吧。这个问题http://topic.csdn.net/t/20050306/19/3828736.html有讨论,看看。
 
我的意思是自己写的代码

var
nid: TNotifyIconData;
begin
nid.cbSize := sizeof(nid);
nid.Wnd := Handle;
nid.uID := MY_MESSAGE;
nid.uFlags := 0;
nid.hIcon := 0;
nid.szTip := 'Icon';
nid.uCallbackMessage:=tray_callback;
Shell_NotifyIcon(NIM_DELETE, @nid);
application.Terminate;

程序是退出了,可托盘小图标还在,拿鼠标在Icon上晃几下,Icon才消失
 
我上面说的你看了没有啊你是直接在delphi中运行的还是在外面直接点exe文件运行的
 
在delphi中运行的还是在外面直接点exe文件运行
结果都不得一样
 
没有知道的吗? 各位大虾们
 
退出时用代码刷新一下托盘区即可。
 
application.Terminate;

不要用这句,把你的代码放在 onclose 事件里,去掉 application.Terminate;
试试
 
to:hbqckzj

怎么刷新?给个例子吧,谢谢
 
procedure TMainForm.FormCreate(Sender: TObject);
var
RegF:TRegistry;
begin
RegF:=TRegistry.Create;
RegF.RootKey:=HKEY_LOCAL_MACHINE;
try
If RegF.OpenKey('SOFTWARE/Microsoft/Windows/CurrentVersion/Run',True) Then
RegF.WriteString('网上报车(通知、审批)系统','"'+ParamStr(0)+'"')
Finally
RegF.CloseKey;
RegF.Free;
End;
ntid.cbSize := sizeof(TnotifyIconDataA);
ntid.Wnd := Handle;
ntid.uID := iid;
ntid.uFlags := NIF_ICON + NIF_TIP + NIF_MESSAGE;
ntid.uCallbackMessage := mymsg;
ntid.hIcon := application.Icon.Handle;
ntid.szTip := '网上报车(通知、审批)系统';
shell_notifyicona(NIM_ADD,@ntid);
SetWindowLong(Application.Handle, GWL_EXSTYLE, WS_EX_TOOLWINDOW);
end;

procedure TMainForm.formClose(Sender: TObject);
begin
ntid.cbSize := sizeof(TnotifyIconDataA);
ntid.Wnd := Handle;
ntid.uID := iid;
ntid.uFlags := NIF_ICON + NIF_TIP + NIF_MESSAGE;
ntid.uCallbackMessage := mymsg;
shell_notifyicona(NIM_DELETE,@ntid);
Application.Terminate;
end;
 
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ShellApi;

type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
ntid: TnotifyIconDataA;
implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
ntid.cbSize := sizeof(TnotifyIconDataA);
ntid.Wnd := Handle;
//ntid.uID := iid;
ntid.uFlags := NIF_ICON + NIF_TIP + NIF_MESSAGE;
//ntid.uCallbackMessage := mymsg;
ntid.hIcon := application.Icon.Handle;
ntid.szTip := '网上报车(通知、审批)系统';
shell_notifyicona(NIM_ADD,@ntid);
SetWindowLong(Application.Handle, GWL_EXSTYLE, WS_EX_TOOLWINDOW);
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
// ntid要是全局变量,删除的时候其实都不需要设置什么了
shell_notifyicona(NIM_DELETE,@ntid);
Application.Terminate;
end;

end.
 
To:0桁骀

完全用你的代码,在WIN200下还是出现退出程序后,托盘图标不能自动消失的问题
 
delphi世界qq群:23981160,喜欢Delphi的都进来
 
没有人能解决这个问题吗?

天哪,DELPHI高手在哪里!
 
var
nid: TNotifyIconData;
begin
nid.cbSize := sizeof(nid);
nid.Wnd := Handle;
nid.uID := MY_MESSAGE;
nid.uFlags := NIF_ICON; // 这个还是要的
nid.hIcon := 0;
nid.szTip := 'Icon';
nid.uCallbackMessage:=tray_callback;
Shell_NotifyIcon(NIM_DELETE, @nid);
 
去掉图标后,再调用一下这个过程吧:

procedure Refreshtray;
var
AID: _NOTIFYICONDATA;
begin
AID.cbSize := SizeOf(AID);
AID.Wnd := Handle;
AID.uID := 0;
AID.uFlags := NIF_ICON;
AID.uCallbackMessage := 0;
AID.hIcon := Icon.Handle;
AID.szTip := '';
Shell_NotifyIcon(NIM_ADD, @AID);
Shell_NotifyIcon(NIM_DELETE, @AID);
end;

在一个隐藏托盘图标的程序中试验通过,系统为windowsXP。没有在Windows2000中进行试验。
 
还是不行呀
 
高手高手,你在哪里?我这个问题不能解决吗?
 
其实用cooltrayicon这个控件不错啊!

自己写的话因为已经在系统注册了托盘,退出的时候先释放,然后给托盘区域发送一个刷新消息就搞定了
 
后退
顶部