我怎么把窗口始终在桌面的最前面啊(在DELPHI里面)

时间:2022-01-07 20:29:38
我怎么把窗口始终在桌面的最前面啊(在DELPHI里面),就是说不管当前的激活窗口是什么,我的应用程序的窗口都在最前面

16 个解决方案

#1


MainForm.FormStyle:=fsStayOnTop;

#2


设置 窗体的 FormStyle 属性为 fsStayOnTop

#3


也可以直接在你的属性设置里把formstyle的改成fsStayOnTop就可以了,楼上的用代码动态实现也可以,你把那句放到formcreate事件中,不要搞错名字了,也许你的是form1哦,自己看看,

#4


没有用啊,兄弟们,当我激活其他窗口时,就被其他窗口给遮住了啊

#5


FormStyle 属性为 fsStayOnTop

#6


把 主窗口的 FormStyle 属性为 fsStayOnTop

#7


BOOL SetWindowPos(
  HWND hWnd,             // handle to window
  HWND hWndInsertAfter,  // placement-order handle
  int X,                 // horizontal position
  int Y,                 // vertical position
  int cx,                // width
  int cy,                // height
  UINT uFlags            // window-positioning options
);

将第二个参数设置为HWND_TOPMOST
SetWindowPos(form1.handle,HWND_TOPMOST,0,0,300,300,0)

#8


form1.showmodal;

#9



  formstyle :=  fsStayOnTop

#10


主窗体的(Main Form )
MainForm.FormStyle:=fsStayOnTop;

#11


SetWindowPos(Form.handle,HWND_TOPMOST,0,0,500,500,0)

#12


调用windows api函数SetWindowpos,
BOOL SetWindowPos(
  HWND hWnd,             // handle to window
  HWND hWndInsertAfter,  // placement-order handle
  int X,                 // horizontal position
  int Y,                 // vertical position
  int cx,                // width
  int cy,                // height
  UINT uFlags            // window-positioning options
);
是函数原形,
比如:
始终最前:
procedure Tform1.button1click (sender: TObject);
begin
setwindowpos(form1.handle,HWND_TOPMOST,form1.left,form1.top.form1.width,form1.height,o);
end;
恢复正常:
procedure Tform2.button1click (sender: TObject);
begin
setwindowpos(form1.handle,HWND_NOTOPMOST,form1.left,form1.top.form1.width,form1.height,o);
end;

#13


以上的方法没错
但对于把自己注入到其他进程中,然后热键呼出时就不行了,奇怪

#14


form1.showmodal

#15


在Form1 里面,OnTop Form2:

//方法(一):
procedure TForm1.Button1Click(Sender: TObject);
begin
  try
    Hide;
    Application.NormalizeAllTopMosts;
    Form2.ShowModal;
    Application.RestoreTopMosts;
  finally
    Form2.Show;
end;

并且,在Form2的OnShow中,添加代码:
SetWindowPos(Handle,HWND_TOPMOST,0, 0, 0, 0,SWP_NOMOVE or SWP_NOSIZE); 

//方法(二):
//重载CreateParams()
TForm2 = class(TForm)
  ...
public
  { Public declarations }
  procedure CreateParams(VAR Params: TCreateParams); override;   
  ..
end;

procedure TForm2.CreateParams(var Params: TCreateParams);
begin
  inherited;
  with Params do
  begin
    ExStyle :=ExStyle or WS_EX_TOPMOST;
  end;
  Params.WndParent := 0;//表示Form2的父窗口不是Form1,就可以最前了
end;

#16


Params.WndParent := 0
我怎么没想到呢:)
showmodal一定不行,要使form2弹出且form1进程仍处于运行而不是等待状态,所以第二种方法可能可行,主要还没试验:)

#1


MainForm.FormStyle:=fsStayOnTop;

#2


设置 窗体的 FormStyle 属性为 fsStayOnTop

#3


也可以直接在你的属性设置里把formstyle的改成fsStayOnTop就可以了,楼上的用代码动态实现也可以,你把那句放到formcreate事件中,不要搞错名字了,也许你的是form1哦,自己看看,

#4


没有用啊,兄弟们,当我激活其他窗口时,就被其他窗口给遮住了啊

#5


FormStyle 属性为 fsStayOnTop

#6


把 主窗口的 FormStyle 属性为 fsStayOnTop

#7


BOOL SetWindowPos(
  HWND hWnd,             // handle to window
  HWND hWndInsertAfter,  // placement-order handle
  int X,                 // horizontal position
  int Y,                 // vertical position
  int cx,                // width
  int cy,                // height
  UINT uFlags            // window-positioning options
);

将第二个参数设置为HWND_TOPMOST
SetWindowPos(form1.handle,HWND_TOPMOST,0,0,300,300,0)

#8


form1.showmodal;

#9



  formstyle :=  fsStayOnTop

#10


主窗体的(Main Form )
MainForm.FormStyle:=fsStayOnTop;

#11


SetWindowPos(Form.handle,HWND_TOPMOST,0,0,500,500,0)

#12


调用windows api函数SetWindowpos,
BOOL SetWindowPos(
  HWND hWnd,             // handle to window
  HWND hWndInsertAfter,  // placement-order handle
  int X,                 // horizontal position
  int Y,                 // vertical position
  int cx,                // width
  int cy,                // height
  UINT uFlags            // window-positioning options
);
是函数原形,
比如:
始终最前:
procedure Tform1.button1click (sender: TObject);
begin
setwindowpos(form1.handle,HWND_TOPMOST,form1.left,form1.top.form1.width,form1.height,o);
end;
恢复正常:
procedure Tform2.button1click (sender: TObject);
begin
setwindowpos(form1.handle,HWND_NOTOPMOST,form1.left,form1.top.form1.width,form1.height,o);
end;

#13


以上的方法没错
但对于把自己注入到其他进程中,然后热键呼出时就不行了,奇怪

#14


form1.showmodal

#15


在Form1 里面,OnTop Form2:

//方法(一):
procedure TForm1.Button1Click(Sender: TObject);
begin
  try
    Hide;
    Application.NormalizeAllTopMosts;
    Form2.ShowModal;
    Application.RestoreTopMosts;
  finally
    Form2.Show;
end;

并且,在Form2的OnShow中,添加代码:
SetWindowPos(Handle,HWND_TOPMOST,0, 0, 0, 0,SWP_NOMOVE or SWP_NOSIZE); 

//方法(二):
//重载CreateParams()
TForm2 = class(TForm)
  ...
public
  { Public declarations }
  procedure CreateParams(VAR Params: TCreateParams); override;   
  ..
end;

procedure TForm2.CreateParams(var Params: TCreateParams);
begin
  inherited;
  with Params do
  begin
    ExStyle :=ExStyle or WS_EX_TOPMOST;
  end;
  Params.WndParent := 0;//表示Form2的父窗口不是Form1,就可以最前了
end;

#16


Params.WndParent := 0
我怎么没想到呢:)
showmodal一定不行,要使form2弹出且form1进程仍处于运行而不是等待状态,所以第二种方法可能可行,主要还没试验:)