请问如何将窗体最小化到系统托盘?

解决方案 »

  1.   

    想省事吗,用raize,里面有一个组件,放上去就ok了
      

  2.   

    uses
      ShellAPI;const
      WM_HIDEAPP=WM_USER+21;procedure TForm1.Button1Click(Sender: TObject);
    var
      lpData:PNotifyIconData;
    begin
      lpData:=New(PNotifyIconDataA);
      lpData.cbSize:=SizeOf(PNotifyIconDataA);
      lpData.Wnd:=Application.Handle;
      lpData.hIcon:=Application.Icon.Handle;
      lpData.uCallbackMessage:=WM_HIDEAPP;
      lpData.uID:=0;
      lpData.szTip:='提示信息';
      lpData.uFlags:=NIF_ICON or NIF_MESSAGE or NIF_TIP;
      Shell_NotifyIcon(NIM_ADD,lpData);
      dispose(lpData);
      self.Hide;
      ShowWindow(Application.Handle,SW_HIDE);
    end;
      

  3.   


    //------------------------------------------------------------------------------
    //
    // Summary
    //
    // Author: Chris Mao
    //
    // History
    // \Version    \Date        \Revision
    // =========   ===========  =============================================
    // 1.0.0.0     2005-11-13   New Version
    //
    //------------------------------------------------------------------------------unit TrayIconUnit;interfaceuses  Windows, SysUtils, Classes, Messages, Menus, Graphics, ExtCtrls, Forms,
     ShellAPI;type
      ENotifyIconError = class(Exception);  TTrayNofifyIcon = class(TComponent)
      private
        FDefaultIcon: THandle;
        FHideTask: Boolean;
        FIconVisible: Boolean;
        FHint: String;
        FIcon: TIcon;
        FOnDblClick: TNotifyEvent;
        FOnClick: TNotifyEvent;
        FPopuMenu: TPopupMenu;
        FNoShowClick: Boolean;
        FTimer: TTimer;
        Tnd: TNotifyIconData;
        procedure SetHideTask(const Value: Boolean);
        procedure SetHint(const Value: String);
        procedure SetIcon(const Value: TIcon);
        procedure SetIconVisible(const Value: Boolean);
        procedure SetPopuMenu(const Value: TPopupMenu);
        procedure SendTrayMessage(Msg: DWORD; Flags: UINT);
        function ActiveIconHandle: THandle;
        procedure OnButtonTimmer(Sender: TObject);
      protected
        procedure Loaded; override;
        procedure LoadDefaultIcon; virtual;
        procedure Notification(AComponent: TComponent; Operation: TOperation); override;
      public
        constructor Create(AOwer: TComponent); override;
        destructor Destroy; override;
      published
        property Icon: TIcon read FIcon write SetIcon;
        property HideTask: Boolean read FHideTask write SetHideTask default False;
        property Hint: String read FHint write SetHint;
        property IconVisible: Boolean read FIconVisible write SetIconVisible default False;
        property PopuMenu: TPopupMenu read FPopuMenu write SetPopuMenu;
        property OnClick: TNotifyEvent read FOnClick write FOnClick;
        property OnDblClick: TNotifyEvent read FOnDblClick write FOnDblClick;
      end;implementationtype
      TIconManager = class
      private
        FHWindow: HWnd;
        procedure TrayWndProc(var Msg: TMessage);
      public
        constructor Create;
        destructor Destroy; override;
        property HWindow: HWnd read FHWindow write FHWindow;
      end;var
      IconMgr: TIconManager;
      DDGM_TRAYICON: Integer;{ TIconManager }constructor TIconManager.Create;
    begin
      FHWindow := AllocateHWnd(TrayWndProc);
    end;destructor TIconManager.Destroy;
    begin
      if FHWindow <> 0 then DeallocateHWnd(FHWindow);
      inherited Destroy;
    end;procedure TIconManager.TrayWndProc(var Msg: TMessage);
    var
      Pt: TPoint;
      TheIcon: TTrayNofifyIcon;
    begin
      if Msg.Msg = DDGM_TRAYICON then begin//it's tray callback message
        TheIcon := TTrayNofifyIcon(Msg.WParam);
        case Msg.LParam of
          WM_LBUTTONDOWN: TheIcon.FTimer.Enabled := True;
          WM_LBUTTONDBLCLK:
            begin
              TheIcon.FNoShowClick := True;
              if Assigned(TheIcon.FOnDblClick) then TheIcon.FOnDblClick(Self); //TheIcon
            end;
          WM_RBUTTONDOWN:
            begin
              if Assigned(TheIcon.FPopuMenu) then begin
                 SetForegroundWindow(IconMgr.HWindow);
                 GetCursorPos(Pt);
                 TheIcon.FPopuMenu.Popup(Pt.X, Pt.Y);
                 PostMessage(IconMgr.HWindow, WM_USER, 0, 0);
              end;
            end;
        end;
      end
      else
        Msg.Result := DefWindowProc(FHWindow, Msg.Msg, Msg.WParam, Msg.LParam);
    end;{ TTrayNofifyIcon }function TTrayNofifyIcon.ActiveIconHandle: THandle;
    begin
      if (FIcon.Handle <> 0)
        then Result := FIcon.Handle
        else Result := FDefaultIcon; 
    end;constructor TTrayNofifyIcon.Create(AOwer: TComponent);
    begin
      inherited Create(AOwer);
      FIcon := TIcon.Create;
      FTimer := TTimer.Create(Self);
      FTimer.Enabled := False;
      FTimer.Interval := GetDoubleClickTime;
      FTimer.OnTimer := OnButtonTimmer;
      LoadDefaultIcon;
    end;destructor TTrayNofifyIcon.Destroy;
    begin
      if FIconVisible then SetIconVisible(False);
      FIcon.Free;
      FTimer.Free;
      inherited Destroy;
    end;procedure TTrayNofifyIcon.LoadDefaultIcon;
    begin
      FDefaultIcon := LoadIcon(0, IDI_WINLOGO);
    end;procedure TTrayNofifyIcon.Loaded;
    begin
      inherited;
      if FIconVisible then
        SendTrayMessage(NIM_ADD, NIF_MESSAGE or NIF_ICON or NIF_TIP);
    end;procedure TTrayNofifyIcon.Notification(AComponent: TComponent;
      Operation: TOperation);
    begin
      inherited Notification(AComponent, Operation);
      if (Operation = opRemove) and (AComponent = PopuMenu) then
        PopuMenu := Nil;
    end;procedure TTrayNofifyIcon.OnButtonTimmer(Sender: TObject);
    begin
      FTimer.Enabled := False;
      if not FNoShowClick and Assigned(FOnClick) then
        FOnClick(Self);
      FNoShowClick := False;
    end;procedure TTrayNofifyIcon.SendTrayMessage(Msg: DWORD; Flags: UINT);
    begin
      with Tnd do begin
        cbSize := SizeOf(Tnd);
        StrPLCopy(szTip, PChar(FHint), SizeOf(szTip));
        uFlags := Flags;
        uID := UINT(Self);
        Wnd := IconMgr.HWindow;
        uCallbackMessage := DDGM_TRAYICON;
        hIcon := ActiveIconHandle;
      end;
      Shell_NotifyIcon(Msg, @Tnd);
    end;procedure TTrayNofifyIcon.SetHideTask(const Value: Boolean);
    const
      ShowArray: array [Boolean] of Integer = (SW_ShowNormal, SW_Hide);
    begin
      if FHideTask <>  Value then begin
        FHideTask := Value;
        if not(csDesigning in ComponentState) then
          ShowWindow(Application.Handle, ShowArray[FHideTask]);
      end;
    end;procedure TTrayNofifyIcon.SetHint(const Value: String);
    begin
      if FHint <> Value then begin
        FHint := Value;
        if FIconVisible then
          SendTrayMessage(NIM_MODIFY, NIF_TIP);
      end;
    end;procedure TTrayNofifyIcon.SetIcon(const Value: TIcon);
    begin
      FIcon.Assign(Value);
      if FIconVisible then
        SendTrayMessage(NIM_MODIFY, NIF_ICON);
    end;procedure TTrayNofifyIcon.SetIconVisible(const Value: Boolean);
    const
      MsgArray: array [Boolean] of DWORD = (NIM_DELETE, NIM_ADD);
    begin
      if FIconVisible <> Value then begin
        FIconVisible := Value;
        SendTrayMessage(MsgArray[FIconVisible], NIF_MESSAGE or NIF_ICON or NIF_TIP);
      end;
      
    end;procedure TTrayNofifyIcon.SetPopuMenu(const Value: TPopupMenu);
    begin
      FPopuMenu := Value;
      if Value <> Nil then Value.FreeNotification(Self);
    end;const
      TrayMsgStr = 'CADSonic.TrayNofifyIconMsg';initialization  DDGM_TRAYICON := RegisterWindowMessage(TrayMsgStr);
      IconMgr := TIconManager.Create;finalization
      IconMgr.Free;end.
      

  4.   

    cooltray 控件不错 我一直用它