怎样把程序最小化到托盘上?我现在的麻烦是按下最小化按钮之后根本就不能最小化到托盘上,procedure InstIcon(ToyIcon:TIcon;WinHandle:THandle;cbMessage:Integer);
begin
  IconData.cbSize:=Sizeof(IconData);
  IconData.Wnd:=WinHandle;
  IconData.uID:=ICON_ID;
  IconData.uFlags:=NIF_MESSAGE or NIF_ICON or NIF_TIP;
  IconData.uCallbackMessage:=cbMessage;
  IconData.hIcon:=ToyIcon.Handle;
  IconData.szTip:='LavaTech--Enhance the life!';       
  Shell_NotifyIcon(NIM_ADD,@IconData);
end;
除了上面的代码还用什么?

解决方案 »

  1.   

    const
      WM_BARICON=WM_USER+200;
    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 :=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);
         dispose(lpData);
         Form1.Visible := True;
       end;
    end;
    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 :=application.Icon.Handle;
         //Form1.Icon.Handle;//LoadIcon(Form1.Handle,'TRANS.ICO');//Form1.Icon.Handle;
         lpData.uCallbackMessage := WM_BARICON;
         lpData.uID :=0;
         lpData.szTip := '查询服务器';
         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;
      

  2.   

    const
      CM_RESTORE = WM_USER + $1000; {自定义的“恢复”消息}
      WZGL_APP_NAME = 'demo';const
      WM_WZGLNOTIFY = WM_USER + 100; //自定义消息
      strNotifytip = '状态栏程序Demo'; //状态区的提示信息
      ID_MAIN = 100; // 定义图标的ID  public
        function AddIcon(hwnd: HWND): Boolean; //在状态区添加图标
        function RemoveIcon(hwnd: HWND): Boolean; //从状态区移去图标
        procedure Notify(var Msg: TMessage); message WM_WZGLNOTIFY;
          //自定义消息处理函数
        procedure minimize(sender: Tobject);
          //定义最小化过程,赋给Application.OnMinimize;
        procedure CreateParams(var Params: TCreateParams); override;
        procedure RestoreRequest(var message: TMessage); message CM_RESTORE;
        { Public declarations }
    var
      Frm_StatebarDemo: TFrm_StatebarDemo;
      nid: NOTIFYICONDATA;
      i: integer;
    procedure TFrm_StatebarDemo.CreateParams(var Params: TCreateParams);
    begin
      inherited CreateParams(Params);
      Params.WinClassName := WZGL_APP_NAME;
    end;{处理“恢复”消息}procedure TFrm_StatebarDemo.RestoreRequest(var message: TMessage);
    begin
      if IsIconic(Application.Handle) = True then //窗体是否最小化
        Application.Restore //恢复窗体
      else
        Application.BringToFront; //提到前面显示   把最后的活动窗体放在其余的应用程序之上
    end;//在状态区添加图标function TFrm_StatebarDemo.AddIcon(hwnd: HWND): Boolean;
    begin
      nid.cbSize := sizeof(NOTIFYICONDATA);
      nid.Wnd := hwnd;
      nid.uID := ID_MAIN; //const ID_MAIN=100 状态栏图标ID
      nid.uFlags := NIF_MESSAGE or NIF_ICON or NIF_TIP;
      nid.uCallbackMessage := WM_WZGLNOTIFY;
      nid.hIcon := LoadIcon(hInstance, 'MAINICON');
      strCopy(nid.szTip, strNotifyTip);
      AddIcon := Shell_NotifyIcon(NIM_ADD, @nid);
    end;
    //从状态区移去图标function TFrm_StatebarDemo.RemoveIcon(hwnd: HWND): Boolean;
    var
      nid: NOTIFYICONDATA;
    begin
      nid.cbSize := sizeof(NOTIFYICONDATA);
      nid.Wnd := hwnd;
      nid.uID := ID_MAIN;
      nid.uFlags := 0;
      RemoveIcon := Shell_NotifyIcon(NIM_DELETE, @nid);
    end;//自定义消息处理函数procedure TFrm_StatebarDemo.Notify(var Msg: TMessage);
    var
      Pt: TPoint;
    begin
      case msg.LParam of
        WM_RBUTTONDOWN: //当点击右键时,弹出快捷菜单
          begin
            SetForeGroundWindow(nid.wnd);
            GetCursorPos(Pt);
            Popupmenu.Popup(pt.x, pt.y);
          end;
      end;
    end;//定义最小化过程,赋给Application.OnMinimize;procedure TFrm_StatebarDemo.minimize(sender: Tobject);
    begin
      AddIcon(handle);
      ShowWindow(Application.handle, sw_hide)
    end;procedure TFrm_StatebarDemo.FormDestroy(Sender: TObject);
    begin
      RemoveIcon(handle);
    end;
      

  3.   

    建议去网上搜索一下任务栏图标的VCL控件
    一切过程都是封装好了的~
    然后参照楼上的OnMinimize事件的代码
      

  4.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, shellapi, Menus, ExtCtrls;
    const
      TrayIconID = 1;
      CM_TRAYICON=WM_USER+1001;
    type
      TForm1 = class(TForm)
        PopupMenu1: TPopupMenu;
        Timer1: TTimer;
        N1: TMenuItem;
        N2: TMenuItem;
        N3: TMenuItem;
        procedure FormCreate(Sender: TObject);
        procedure FormClose(Sender: TObject; var Action: TCloseAction);
        procedure N1Click(Sender: TObject);
        procedure N2Click(Sender: TObject);
        procedure Timer1Timer(Sender: TObject);
      private
        FIcon: TIcon;
        Flag: Boolean;
        nid: TNotifyIconData;
        procedure MessageHandler(var msg: TMessage); message CM_TRAYICON;
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
    begin
      FIcon := TIcon.Create;
      FIcon.Handle := LoadIcon(HInstance, 'MainIcon' );
      if FIcon.Handle = 0 then
      begin
        MessageDlg('无法打开图标!', mtError, [mbok], 0);
        Application.Terminate;
        exit;
      end;  with nid do
      begin
        cbSize := sizeof(TNotifyIconData);
        Wnd := Handle;
        uID := TrayIconID;
        uFlags := NIF_MESSAGE or NIF_ICON or NIF_TIP;
        uCallbackMessage := CM_TRAYICON;
        hIcon := FIcon.Handle;
        StrPCopy(szTip, '这是一个测试程序!')
      end;
      Shell_NotifyIcon(NIM_ADD, @nid);
      SetWindowLong(Application.Handle, GWL_EXSTYLE, WS_EX_TOOLWINDOW);
    end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      Shell_NotifyIcon(NIM_DELETE, @nid);
      FIcon.Free;
    end;procedure TForm1.N1Click(Sender: TObject);
    begin
      MessageDlg('这是一个测试程序!', mtInformation, [mbOK], 0);
    end;procedure TForm1.N2Click(Sender: TObject);
    begin
      close;
    end;procedure TForm1.Timer1Timer(Sender: TObject);
    begin
      Timer1.Enabled := false;
      if Flag = false then
        if Visible then
          Hide
        else
          Show;
    end;procedure Tform1.MessageHandler(var msg: TMessage);
    var
      Point: TPoint;
    begin
      if msg.WParam = TrayIconID then
        case msg.LParam of
          WM_LBUTTONDOWN:
          begin
            with Timer1 do
            begin
              Enabled := true;
              Interval := GetDoubleClickTime;
            end;
          end;
          WM_LBUTTONDBLCLK:
          begin
            Flag := true;
            MessageDlg('这是一个测试程序!', mtInformation, [mbok], 0);
            Flag := false;
          end;
          WM_RBUTTONDOWN:
          begin
            GetCursorPos(Point);
            PopupMenu1.Popup(Point.X, Point.Y);
          end;
        end;
    end;end.
      

  5.   

    用控件CoolTrayIcon
    最简单好用http://lysoft.7u7.net
      

  6.   

    你得处理一下最小化消息procedure TMainForm.WMSysCommand(var msg: TWMSysCommand);beginif msg.CmdType and $FFF0 = SC_MINIMIZE thenhideelseinherited;end;
      

  7.   

    raize上边有个控件用这停方便