最近写了个小程序,用到了将应用程序最小化到任务栏的技巧(陈年老技巧了),怕以后不记得了,贴出来与大家分享。
具体原理不说了,就是Windows API.
- unit fMain;
- interface
- uses
- // 记得要有 Windows, Messages,ShellAPI;
- const
- WM_BARICON=WM_USER + 200;
- type
- TfrmMain = class(TForm)
- MainMenu1: TMainMenu;
- PopupMenu1: TPopupMenu;
- private
- { Private declarations }
- procedure RestoreWindow;
- procedure WMSysCommand(var Message: TMessage); message WM_SYSCOMMAND;
- procedure WMBarIcon(var Message:TMessage);message WM_BARICON;
- public
- { Public declarations }
- end;
- var
- frmMain: TfrmMain;
- implementation
- {$R *.dfm}
- procedure TfrmMain.WMBarIcon(var Message: TMessage);
- var
- p: TPoint;
- begin
- if (Message.LParam = WM_LBUTTONDOWN) then
- begin
- RestoreWindow;
- end
- else if (Message.LParam = WM_RBUTTONDOWN) then
- begin
- GetCursorPos(p);
- PopupMenu1.Popup(p.X, p.Y);
- end;
- end;
- procedure TfrmMain.WMSysCommand(var Message: TMessage);
- var
- lpData: PNotifyIconData;
- begin
- if Message.WParam = SC_ICON then
- begin
- //如果用户最小化窗口则将窗口隐藏并在任务栏上添加图标
- lpData := new(PNotifyIconDataA);
- lpData.cbSize := 88;
- //SizeOf(PNotifyIconDataA);
- lpData.Wnd := Self.Handle;
- lpData.hIcon := Self.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_ADD,lpData);
- dispose(lpData);
- Self.Visible := False;
- end
- else
- begin
- //如果是其它的SystemCommand消息则调用系统缺省处理函数处理之。
- DefWindowProc(Self.Handle,Message.Msg,Message.WParam,Message.LParam);
- end;
- end;
- procedure TfrmMain.RestoreWindow;
- var
- lpData:PNotifyIconData;
- begin
- //如果用户点击任务栏图标则将图标删除并回复窗口。
- lpData := new(PNotifyIconDataA);
- lpData.cbSize := 88;//SizeOf(PNotifyIconDataA);
- lpData.Wnd := Self.Handle;
- lpData.hIcon := Self.Icon.Handle;
- lpData.uCallbackMessage := WM_BARICON;
- lpData.uID :=0;
- lpData.szTip := '来电弹屏系统';
- lpData.uFlags := NIF_ICON or NIF_MESSAGE or NIF_TIP;
- Shell_NotifyIcon(NIM_DELETE,lpData);
- dispose(lpData);
- Self.Visible := True;
- end;
- end.
注意:主窗体一定要有图标,否则任务栏会有空白
当程序最小化到任务栏以后,点击右键,可以出现一个弹出式菜单,可以在里面增加一些处理的代码。