在网上找到一些资料,记录下来:
1、在Uses 中 加入单元 ShellAPI
2、设置一个常量消息号,用于左键单击、双击或右键单击 例如: const WM_BarIcon=WM_User+200;
3、在程序主窗体的 Private 加入两个消息函数
procedure WMSysCommand(var Message: TMessage); message WM_SYSCOMMAND;
procedure WMBarIcon(var Message:TMessage);message WM_BARICON;
4、两个程式的实现:
procedure TForm1.WMSysCommand(var Message: TMessage);
var
lpData:PNotifyIconData;
begin
if Message.WParam = SC_ICON then
begin
//如果用户最小化窗口则将窗口隐藏并在任务栏上添加图标
lpData := new(PNotifyIconDataA);
lpData.cbSize := 88;
lpData.Wnd := Form1.Handle;//注意这里用的是主窗体的 Handle
lpData.hIcon := Application.Icon.Handle; //这里用的是应用程序的 Handle
lpData.uCallbackMessage := WM_BARICON;
lpData.uID :=0;
lpData.szTip := 'Samples';
lpData.uFlags := NIF_ICON or NIF_MESSAGE or NIF_TIP;
Shell_NotifyIcon(NIM_ADD,lpData);
ShowWindow(Application.Handle,SW_HIDE);
Form1.Hide;
dispose(lpData);
end
else inherited;
end;
procedure TForm1.WMBarIcon(var Message: TMessage);
var
lpData:PNotifyIconData;
P : TPoint;
begin
if (Message.LParam = WM_LBUTTONDOWN) then
begin
//如果用户点击任务栏图标则将图标删除并回复窗口。
lpData := new(PNotifyIconDataA);
lpData.cbSize := 88;//SizeOf(PNotifyIconDataA);
lpData.Wnd := Form1.Handle;
lpData.hIcon := Application.Icon.Handle;
lpData.uCallbackMessage := WM_BARICON;
lpData.uID :=0;
lpData.szTip := 'Samples';
lpData.uFlags := NIF_ICON or NIF_MESSAGE or NIF_TIP;
Shell_NotifyIcon(NIM_DELETE,lpData);
ShowWindow(Application.Handle,SW_Show);
dispose(lpData);
Form1.Visible := True;
end;
if (Message.LParam = WM_RButtonDown) then
begin
GetCursorPos(P);
PopupMenu1.Popup(P.X,P.Y);
end;
end;