托盘图标_实现方法_最小化到托盘_关闭到托盘_delphi_托盘汇总
转自:http://midasyang.blog.163.com/blog/static/189744104201141245344681/
启动不显示主窗体
如果通过Form1.Visible:=False;语句来实现的话,会出现主窗体一闪而过的情形。更好的办法是在OnShow事件中添加Application.ShowMainForm := False;
程序不出现在任务栏
procedure TForm1.FormShow(Sender: TObject);
begin
ShowWindow(Application.Handle,SW_HIDE);
end;
点击关闭按钮至托盘
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
CanClose := False;
Self.Hide;
end;
但这儿有个问题,在“开始”菜单中使用关闭或重启系统时,由于程序的存在,系统总是不能关闭或重启, 然后就返回到了桌面。解决方案如下:
//声明拦截WM_QueryEndSession消息的过程
procedure WMQueryEndSession(var Msg: TMessage); message WM_QueryEndSession;
procedure TForm1.WMQueryEndSession(var Msg: TMessage);
begin
Msg.Result := 1;
end;
经测试,系统关机时不会执行OnClose事件,但会执行OnDestroy事件。另Raize托盘控件RzTrayIcon有QueryEndSession(Sender: TObject;
var AllowSessionToEnd: Boolean);事件,把AllowSessionToEnd置为真亦可。
最小化到托盘
procedure WMSysCommand(var Msg: TWMSysCommand); message WM_SYSCOMMAND;
procedure TForm1.WMSysCommand(var Msg: TWMSysCommand);
begin
if Msg.CmdType = SC_MINIMIZE then
Self.Close
else
inherited;
end;
最大化和最小化时的动画
Type
TZoomAction = (zaMinimize, zaMaximize);
procedure ZoomEffect(AForm: TForm; AOperation: TZoomAction);
var
rcStart, rcEnd, rcTray: TRect;
hwndTray, hwndChild: hWnd;
begin
// 寻找系统托盘区的位置
hwndTray := FindWindow(‘Shell_TrayWnd‘, nil);
hwndChild := FindWindowEx(hwndTray, 0, ‘TrayNotifyWnd‘, nil);
GetWindowRect(hwndChild, rcTray);
//点击用于最大化/最小化,并切换起始/结束
if AOperation = zaMinimize then
begin
rcStart := AForm.BoundsRect;
rcEnd := rcTray;
end
else begin
rcEnd := AForm.BoundsRect;
rcStart := rcTray;
end;
DrawAnimatedRects(AForm.Handle, IDANI_CAPTION, rcStart, rcEnd);
end;
再分别在OnCloseQuery中添加
ZoomEffect(Self, zaMinimize);
在OnShow中添加
ZoomEffect(Self, zaMaximize);
左击托盘显示或者隐藏
在托盘的左击事件中添加
if Self.Showing then
Self.Close
else begin
Self.Show;
SetForegroundWindow(Application.Handle);
end
窗体是否处于激活状态
procedure WM_ACTIVATEAPP( var Message:TWMACTIVATEAPP); message WM_ACTIVATEAPP;
procedure TForm1.WMACTIVATEAPP(var message: TWMACTIVATEAPP);
begin
//是否处于激活窗体状态Message.Active
end;
窗体是否最小化状态
if IsIconic(Self.Handle) then
ShowWindow(Self.Handle, SW_RESTORE);
程序总是显示在最上面
简单的办法是Self.FormStyle := fsStayOnTop;但会出现闪烁,比较好的办法如下
if not ShowOnTop then
SetWindowPos(Self.Handle , HWND_NOTOPMOST, 0,0,0,0, SWP_NOMOVE + SWP_NOSIZE) //普通窗口
else
SetWindowPos(Self.Handle, HWND_TOPMOST, 0,0, 0,0, SWP_NOMOVE + SWP_NOSIZE); //最上面
http://shuwen186.blog.163.com/blog/static/1642732020112973721371/