我做的一个例子,能实现QQ有信息进来时图标一闪一闪的功能。 unit Unit1;interfaceuses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,ShellApi, StdCtrls, Menus, ExtCtrls; const mymsg=wm_user+1;iid=100;type TForm1 = class(TForm) PopupMenu1: TPopupMenu; exit1: TMenuItem; Btn_hide: TButton; Display1: TMenuItem; Timer1: TTimer; procedure Btn_hideClick(Sender: TObject); procedure exit1Click(Sender: TObject); procedure Display1Click(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure Timer1Timer(Sender: TObject); procedure FormShow(Sender: TObject); procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean); procedure FormCreate(Sender: TObject); private { Private declarations } procedure MyMessage(var Mouse_msg:tmessage);message MyMsg; procedure Min_Size(var Size_msg:TWMSYSCOMMAND);message WM_SYSCOMMAND; public { Public declarations } ShowOrHide:bool; end;var Form1: TForm1; popm:tnotifyicondataa; implementation{$R *.DFM} //最少化 procedure TForm1.Min_Size(var Size_msg:TWMSYSCOMMAND); begin inherited; if size_msg.CmdType=SC_MINIMIZE then Btn_hide.click; Size_msg.Result:=0; end;procedure TForm1.MyMessage(var Mouse_msg:tmessage); var mypt:Tpoint; begin inherited; if Mouse_msg.LParam=WM_LBUTTONDBLCLK then //双击左键 begin Form1.Show; Application.BringToFront; end else if Mouse_msg.LParam=wm_rbuttonup then //单击右键 begin GetCursorPos(mypt); PopupMenu1.Popup(mypt.x,mypt.y); end; Mouse_msg.Result:=0; end;procedure TForm1.Btn_hideClick(Sender: TObject); begin popm.cbSize:=sizeof(tnotifyicondataa); popm.Wnd:=handle; popm.uID:=iid; popm.uFlags:=NIF_ICON+NIF_TIP+NIF_MESSAGE; popm.uCallbackMessage:=mymsg; popm.hIcon:=Application.Icon.Handle; popm.szTip:='邮件系统'; Shell_NotifyIconA(NIM_ADD,@popm); Form1.Hide; ShowOrHide:=false; Timer1.Enabled:=true;end;procedure TForm1.exit1Click(Sender: TObject); begin Form1.Close; end;procedure TForm1.Display1Click(Sender: TObject); begin Form1.Show; end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin Shell_NotifyIconA(NIM_DELETE,@popm); Application.Terminate; end;procedure TForm1.Timer1Timer(Sender: TObject); begin if ShowOrHide then begin popm.hIcon:=Application.Icon.Handle; Shell_NotifyIconA(NIM_MODIFY,@popm); end else begin popm.hIcon:=0; Shell_NotifyIconA(NIM_MODIFY,@popm); end; ShowOrHide:= not ShowOrHide; end;procedure TForm1.FormShow(Sender: TObject); begin Timer1.Enabled:=false; end;procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean); begin if MessageDlg('真的要退出邮件系统吗?',mtConfirmation, [mbYes, mbNo], 0) = mrYes then CanClose:=true else CanClose:=false;end;procedure TForm1.FormCreate(Sender: TObject); var errNO:integer; hMutex:HWND; begin hMutex:=CreateMutex(nil,False,Pchar(application.Title)); ErrNo:=GetLastError; if errNO =error_already_exists then begin Application.MessageBox('邮件系统已经运行了。','错误',MB_ICONINFORMATION); Application.Terminate; end; end;end.
// Shell_NotifyIconA(NIM_MODIFY,@popm);可以改变图标 if ShowOrHide then begin popm.hIcon:=Application.Icon.Handle; Shell_NotifyIconA(NIM_MODIFY,@popm); end else begin popm.hIcon:=0; Shell_NotifyIconA(NIM_MODIFY,@popm); end; ShowOrHide:= not ShowOrHide;
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,ShellApi,
StdCtrls, Menus, ExtCtrls;
const mymsg=wm_user+1;iid=100;type
TForm1 = class(TForm)
PopupMenu1: TPopupMenu;
exit1: TMenuItem;
Btn_hide: TButton;
Display1: TMenuItem;
Timer1: TTimer;
procedure Btn_hideClick(Sender: TObject);
procedure exit1Click(Sender: TObject);
procedure Display1Click(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure Timer1Timer(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
procedure FormCreate(Sender: TObject); private
{ Private declarations }
procedure MyMessage(var Mouse_msg:tmessage);message MyMsg;
procedure Min_Size(var Size_msg:TWMSYSCOMMAND);message WM_SYSCOMMAND;
public
{ Public declarations }
ShowOrHide:bool;
end;var
Form1: TForm1;
popm:tnotifyicondataa;
implementation{$R *.DFM}
//最少化
procedure TForm1.Min_Size(var Size_msg:TWMSYSCOMMAND);
begin
inherited;
if size_msg.CmdType=SC_MINIMIZE then
Btn_hide.click;
Size_msg.Result:=0;
end;procedure TForm1.MyMessage(var Mouse_msg:tmessage);
var
mypt:Tpoint;
begin
inherited;
if Mouse_msg.LParam=WM_LBUTTONDBLCLK then //双击左键
begin
Form1.Show;
Application.BringToFront;
end
else if Mouse_msg.LParam=wm_rbuttonup then //单击右键
begin
GetCursorPos(mypt);
PopupMenu1.Popup(mypt.x,mypt.y);
end;
Mouse_msg.Result:=0;
end;procedure TForm1.Btn_hideClick(Sender: TObject);
begin
popm.cbSize:=sizeof(tnotifyicondataa);
popm.Wnd:=handle;
popm.uID:=iid;
popm.uFlags:=NIF_ICON+NIF_TIP+NIF_MESSAGE;
popm.uCallbackMessage:=mymsg;
popm.hIcon:=Application.Icon.Handle;
popm.szTip:='邮件系统';
Shell_NotifyIconA(NIM_ADD,@popm);
Form1.Hide;
ShowOrHide:=false;
Timer1.Enabled:=true;end;procedure TForm1.exit1Click(Sender: TObject);
begin
Form1.Close;
end;procedure TForm1.Display1Click(Sender: TObject);
begin
Form1.Show;
end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Shell_NotifyIconA(NIM_DELETE,@popm);
Application.Terminate;
end;procedure TForm1.Timer1Timer(Sender: TObject);
begin
if ShowOrHide then
begin
popm.hIcon:=Application.Icon.Handle;
Shell_NotifyIconA(NIM_MODIFY,@popm);
end
else
begin
popm.hIcon:=0;
Shell_NotifyIconA(NIM_MODIFY,@popm);
end;
ShowOrHide:= not ShowOrHide;
end;procedure TForm1.FormShow(Sender: TObject);
begin
Timer1.Enabled:=false;
end;procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
if MessageDlg('真的要退出邮件系统吗?',mtConfirmation, [mbYes, mbNo], 0) = mrYes then
CanClose:=true
else
CanClose:=false;end;procedure TForm1.FormCreate(Sender: TObject);
var
errNO:integer;
hMutex:HWND;
begin
hMutex:=CreateMutex(nil,False,Pchar(application.Title));
ErrNo:=GetLastError;
if errNO =error_already_exists then
begin
Application.MessageBox('邮件系统已经运行了。','错误',MB_ICONINFORMATION);
Application.Terminate;
end;
end;end.
if ShowOrHide then
begin
popm.hIcon:=Application.Icon.Handle;
Shell_NotifyIconA(NIM_MODIFY,@popm);
end
else
begin
popm.hIcon:=0;
Shell_NotifyIconA(NIM_MODIFY,@popm);
end;
ShowOrHide:= not ShowOrHide;