本例子提供了一个完整的托盘程序范例。 
  该程序运行时,先显示一个无边框的窗口做为闪烁窗口,然后关闭该窗口并在托盘区显示程序图标, 在图标上点右键可一个弹出菜单,包括:‘打开windows’、‘显示对话框’、‘关闭’三项。 
program tray1;uses
Windows,
Forms,
Unit1 in 'Unit1.pas' {trayfrm},
Unit2 in 'Unit2.pas' {Form2};{$R *.RES}begin
Application.Initialize;
Application.ShowMainForm:=false;
Application.CreateForm(Ttrayfrm, trayfrm);
ShowWindow(Application.handle,SW_HIDE);
Application.Run;
end. unit Unit1;interfaceuses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ShellAPI, Menus, StdCtrls;
const
IDI_TRAYICON=WM_USER + 10;
TRAY_CALLBACK=WM_USER + 20;
type
Ttrayfrm = class(TForm)
PopupMenu1: TPopupMenu;
N1: TMenuItem;
N2: TMenuItem;
Label1: TLabel;
windows1: TMenuItem;procedure N1Click(Sender: TObject);
procedure N2Click(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormActivate(Sender: TObject);
procedure windows1Click(Sender: TObject);
private
aIcon:HICON;
aIconData:TNotifyIconData;
procedure TrayCallBack(var Msg:TMessage);message TRAY_CALLBACK;
{ Private declarations }
public
{ Public declarations }end;var
trayfrm: Ttrayfrm;implementationuses Unit2;{$R *.DFM}
procedure Ttrayfrm.TrayCallBack(var Msg:TMessage);
var p:TPoint;
begin
if (Msg.LParam=WM_RBUTTONDOWN) or (Msg.LParam=WM_LBUTTONDBLCLK) then
begin
if (Msg.WParam=IDI_TRAYICON) then
begin
GetCursorPos(p);
PopupMenu1.Popup(p.x,p.y);
end;
end;
end;
procedure Ttrayfrm.N1Click(Sender: TObject);
begin
showmessage('Very Good ! ');
end;procedure Ttrayfrm.N2Click(Sender: TObject);
begin
Shell_NotifyIcon(NIM_DELETE,@aIconData);
Application.ProcessMessages;
application.Terminate;
end;procedure Ttrayfrm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
action:=caNone;
hide;
end;procedure Ttrayfrm.FormActivate(Sender: TObject);
//var pData:_APPBARDATA;
begin
ShowWindow(Application.handle,SW_HIDE);
refresh;
sleepex(2000,false);
width:=0;
height:=0;
clientwidth:=0;
clientheight:=0;
aIcon:=LoadIcon(HInstance,'mainicon');
if aIcon <> NULL then
begin
aIconData.uFlags:= NIF_MESSAGE + NIF_ICON + NIF_TIP;
aIconData.uID:=UINT(IDI_TRAYICON);
aIconData.cbSize:=sizeof(TNotifyIconData);
aIconData.Wnd:=Handle;
aIconData.uCallbackMessage:=TRAY_CALLBACK;
aIconData.hIcon:=Application.Icon.Handle;
aIconData.szTip:='托盘范例程序';
Shell_NotifyIcon(NIM_ADD,@aIconData);
end;end;procedure Ttrayfrm.windows1Click(Sender: TObject);
begin
form2:=Tform2.create(self);;
form2.showmodal;
show;
showwindow(Application.handle,SW_HIDE);
end;end. unit Unit2;interfaceuses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;type
TForm2 = class(TForm)
Label1: TLabel;
private
{ Private declarations }
public
{ Public declarations }
end;var
Form2: TForm2;implementation{$R *.DFM}end. 

解决方案 »

  1.   

    我试过直接使用TRAYICON实现,即form最小化的时候直接隐藏(hide),然后在trayicon的事件中加入恢复显示form的方法即可。
      

  2.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,ShellAPI;const
      WM_BARICON=WM_USER+200;
    type
      TForm1 = class(TForm)
      private
        procedure WMSysCommand(var
    Message: TMessage); message WM_SYSCOMMAND;
        procedure WMBarIcon(var
    Message:TMessage);message WM_BARICON;
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.DFM}procedure TForm1.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 := Form1.Handle;
        lpData.hIcon := Form1.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);
        Form1.Visible := False;
      end
      else
      begin
        //如果是其它的SystemCommand
        //消息则调用系统缺省处理函数处理之。
        DefWindowProc(Form1.Handle,Message.
    Msg,Message.WParam,Message.LParam);
      end;
    //
    end;procedure TForm1.WMBarIcon(var Message:TMessage);
    var
      lpData:PNotifyIconData;
    begin
      if (Message.LParam = WM_LBUTTONDOWN) then
      begin
        //如果用户点击任务栏图标则将图标删除并回复窗口。
        lpData := new(PNotifyIconDataA);
        lpData.cbSize := 88;//SizeOf(PNotifyIconDataA);
        lpData.Wnd := Form1.Handle;
        lpData.hIcon := Form1.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);
        dispose(lpData);
        Form1.Visible := True;
      end;
    end;end.