你需要做的有点不同。首先你需要检查表单何时最小化。这可能通过捕捉消息WM_SIZE
procedure WMSize(var Msg: TMessage); message WM_SIZE;
然后进行:
procedure TForm1.WMSize(var Msg: TMessage);
begin
if Msg.WParam = SIZE_MINIMIZED then ....
end;
通常你也想关闭按钮,以尽量减少应用程序。这可以通过实施一个CloseQuery事件来实现。
我给你做了一个基于你自己的代码的小例子。
首先DFM代码:
object Form11: TForm11
Left = 0
Top = 0
Caption = 'Form11'
ClientHeight = 299
ClientWidth = 635
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'Tahoma'
Font.Style = []
OldCreateOrder = False
OnCloseQuery = FormCloseQuery
OnCreate = FormCreate
OnHide = FormHide
PixelsPerInch = 96
TextHeight = 13
object TrayIcon1: TTrayIcon
OnDblClick = TrayIcon1DblClick
Left = 312
Top = 152
end
object PopupMenu1: TPopupMenu
Left = 184
Top = 112
object Close1: TMenuItem
Caption = 'Close'
Default = True
OnClick = Close1Click
end
end
end
然后实际的源代码:
unit Unit11;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtCtrls, Vcl.Menus;
type
TForm11 = class(TForm)
TrayIcon1: TTrayIcon;
PopupMenu1: TPopupMenu;
Close1: TMenuItem;
procedure FormCreate(Sender: TObject);
procedure FormHide(Sender: TObject);
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
procedure Close1Click(Sender: TObject);
procedure TrayIcon1DblClick(Sender: TObject);
private
AllowClose: Boolean;
public
procedure WMSize(var Msg: TMessage); message WM_SIZE;
end;
var
Form11: TForm11;
implementation
{$R *.dfm}
procedure TForm11.Close1Click(Sender: TObject);
begin
AllowClose := True;
Close;
end;
procedure TForm11.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
CanClose := AllowClose;
if not AllowClose then
Hide;
end;
procedure TForm11.FormCreate(Sender: TObject);
begin
AllowClose := false;
TrayIcon1.Hint := 'Hint';
TrayIcon1.AnimateInterval := 200;
TrayIcon1.BalloonTitle := 'Hint';
TrayIcon1.BalloonHint := 'Double click to restore Application';
TrayIcon1.BalloonFlags := bfInfo;
end;
procedure TForm11.FormHide(Sender: TObject);
begin
TrayIcon1.Visible := True;
TrayIcon1.Animate := True;
TrayIcon1.ShowBalloonHint;
end;
procedure TForm11.TrayIcon1DblClick(Sender: TObject);
begin
TrayIcon1.Visible := false;
Show();
WindowState := wsNormal;
Application.BringToFront();
end;
procedure TForm11.WMSize(var Msg: TMessage);
begin
if Msg.WParam = SIZE_MINIMIZED then
Close;
end;
end.
为什么要改变'WindowState'?这足以隐藏主窗体 –
我只是用它来确保“MainForm”已被最小化 –
你隐藏了主窗体。这就是从任务栏中删除按钮。最小化隐藏表单毫无意义。这样做意味着您忘记了表单是正常化还是最大化还是最小化。 –