有Form1、Form2、Form3三个窗体,源码如下:
unit Unit1;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;var
  Form1: TForm1;implementationuses Unit2, Unit3;{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
begin
  SetWindowPos(Form2.Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NoMove or SWP_NoSize or SWP_ShowWindow) ;//Form2
  SetWindowPos(Form1.Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NoMove or SWP_NoSize or SWP_ShowWindow) ;//主窗体
  Form3.Show;
end;end.1、如果不把主窗体置顶的话,Form2只是相对于程序里的3个窗体置顶,还是能被其它程序覆盖。
2、即使把主窗体置顶,也有一个问题,当主窗体和Form2置顶的时候,当鼠标点击它们时,被其它程序覆盖的Form3会跳到前面。如何让Form3老老实实的呆在后面?因为我的程序主窗体是隐藏的,对它Stay on top会把它显示出来。请问如何在主窗体不置顶的时候,对其它窗体置顶,且让非置顶的窗体不要跳到前面?

解决方案 »

  1.   

    procedure TForm1.Button1Click(Sender: TObject);
    begin
      Form2.FormStyle:=fsStayOnTop;
      Form2.Show;
    end;procedure TForm1.Button2Click(Sender: TObject);
    begin
      Form3.FormStyle:=fsStayOnTop;
      Form3.Show;
    end;
      

  2.   

    这个跟我说的效果是一样的,比直接用API更差。
      

  3.   

    1、如果不把主窗体置顶的话,Form2只是相对于程序里的3个窗体置顶,还是能被其它程序覆盖。
    你的最顶是相对于你的程序的最顶,一样会被其他程序的窗体覆盖,想要真正的置顶
    要这样:
       
    这个问题我已回答过我次,好像应该这样做:Public
      procedure Createparams(Var Params:TCreateParams);override;
      ..
    procedure TFormDrop.Createparams(var Params:TCreateParams);
    begin
      Inherited CreateParams(Params);
      With Params do
      begin
        EXStyle:=ExStyle or WS_EX_TOPMOST OR WS_EX_ACCEPTFILES or WS_DLGFRAME
        wndParnet:=GetDesktopWindow; //关键一行,用SetParent都不行!!
      end;
    end; procedure SetFormOnTop(Form: TForm; const bFlag: Boolean);
    begin
      if bFlag then
        SetWindowPos(Form.handle, HWND_TOPMOST, 0, 0, 0, 0, swp_nomove or swp_nosize)
      else
        SetWindowPos(Form.handle, HWND_NOTOPMOST, 0, 0, 0, 0, swp_nomove or swp_nosize);
    end;
     
    2、 同上,该最前的时候就最前,不该的话就取消他。你用了SWP_ShowWindow标志,这样他会把隐藏的窗口显示出来。
      

  4.   

    procedure TForm1.Button1Click(Sender: TObject);
    begin
      Form2.FormStyle:=fsStayOnTop;
      Form2.Show;
    end;procedure TForm1.Button2Click(Sender: TObject);
    begin
      Form3.FormStyle:=fsStayOnTop;
      Form3.Show;
    end;