其实我想做个类似sql server
服务管理器的小东西
窗体设成了最小化
并用setwindowlong把任务栏中的东西去掉
但发现又出现在左下角
不知为什么

解决方案 »

  1.   

    application.mini***
    application.restore.
      

  2.   

    又:Delphi的帮助文件中有个例子演示了当窗口从当前窗口变为后台窗口时如何自动隐藏, 能满足你的要求,找找看.
      

  3.   

    贴出来吧:interfaceuses
      ..., ShellAPI;const
      SYSTRAY_ID = 1;  { 用于系统托盘图标 }
      WM_SYSTRAYMSG = WM_USER + 100; { 自定义消息, 用于系统托盘图标 }
    type
      TForm1 = class(TForm)
        ...
        procedure FormCreate(Sender: TObject);
        procedure AppOnMinimize(Sender:TObject);
        ...
        procedure FormDeactivate(Sender: TObject);
        procedure FormClose(Sender: TObject; var Action: TCloseAction);
      private
        { Private declarations }
        procedure SysTrayOnClick(var message:TMessage); message WM_SYSTRAYMSG;
        { 处理系统托盘图标发来的消息 }
      public
        { Public declarations }
      end;var
      Form1: TForm1;
      SysTrayIcon: TNotifyIconData;{ 定义用于系统托盘图标的变量 }implementationfunction RegisterServiceProcess(dwProcessID, dwType: integer): integer;
             stdcall; external 'KERNEL32.DLL';
             { 声明未公开的API函数。
               此函数将本程序注册为系统进程, 将不被显示在任务列表中
             }procedure TForm1.FormCreate(Sender: TObject);
    begin
      with application do
      begin
        showwindow(handle, SW_HIDE);
        OnMinimize := AppOnMinimize; { 窗口最小化时隐藏 }
        OnDeactivate := FormDeactivate; { 窗口变为后台窗口时隐藏 }
      end;  RegisterServiceProcess(GetcurrentProcessID, 1); { 注册为系统进程 }  with SysTrayIcon do     { 以下是填充系统托盘图标所用数据 }
      begin
        cbSize := sizeof(SysTrayIcon);
        wnd := Handle;
        uID := SYSTRAY_ID;
        uFlags := NIF_ICON OR NIF_MESSAGE OR NIF_TIP;
        uCallBackMessage := WM_SYSTRAYMSG;
        hIcon := Application.Icon.Handle;
        szTip := '系统进程监控';
      end;  Shell_NotifyIcon(NIM_ADD, @SysTrayIcon); { 将图标加入系统托盘 }
     end;procedure Tform1.AppOnMinimize(Sender: TObject);
    begin
      ShowWindow(application.handle, SW_HIDE); { 隐藏本进程在任务栏上的任务按钮 }
    end;procedure TForm1.FormDeactivate(Sender: TObject);
    begin
      application.minimize;
    end;procedure tform1.SysTrayOnClick(var message:TMessage);
    begin     { 处理系统托盘图标发来的消息 }
      with message do
      begin
        if (lparam = wm_lbuttondown) or (lparam = wm_rbuttondown) then
        begin       { 当用户在系统托盘图标上左击或右击时恢复窗口 }
          application.restore;
          SetForegroundWindow(Handle);
          showwindow(application.handle, SW_HIDE);
          { 隐藏本进程在任务栏上的任务按钮 }
        end;
      end;
    end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      Shell_NotifyIcon(NIM_DELETE, @SysTrayIcon); { 删除系统托盘上的图标, 非必须 }
      RegisterServiceProcess(GetcurrentProcessID, 0); { 从系统进程中注销 }
    end;    
    关键是这里:
    with application do
    begin
        showwindow(handle, SW_HIDE);
        OnMinimize := AppOnMinimize; { 窗口最小化时隐藏 }
        OnDeactivate := FormDeactivate; { 窗口变为后台窗口时隐藏 }
    end;          
      

  4.   

    你最小化的不是主窗体,就当然缩到左下角了,你把它Hide掉就行了。
      

  5.   

    试试可以吗
    ------------------------
    procedure TForm1.FormActivate(Sender: TObject);
    begin
      // 隐藏Form1   注意FORM1的Borderstyle设置为bsNone
      Form1.width:=0;
      Form1.Height:=0;
      ShowWindow( Application.Handle, SW_HIDE );
    end;