如何让窗口总在最上面(请看完问题后再回答)(100分)

  • 主题发起人 主题发起人 softchina
  • 开始时间 开始时间
S

softchina

Unregistered / Unconfirmed
GUEST, unregistred user!
我的程序中有两个窗体(它们是平铺的,互相不遮挡)要求总在其他
程序的上面,我使用了下面4种方法:
1)FormStyle:=FsStayOnTop;
2)API函数:
; ;SetWindowpos(Form1.Handle,HWND_TOPmost,0,0,0,0,swp_nomove or swp_nosize); ;
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;
4)使用AHM等的控件
但程序运行一段时间后,这个窗体还是被其他的窗体覆盖,没办法我只能用Timer
每0.2秒强行将窗体放到最前面:(

请问这是什么原因,该怎么解决呢?(请给出代码最好,谢谢)
 
兄弟,我这里有个好的控件,如果要,我给你发过去
我实验过了,可以用的
 
兄弟,如果好用的话,100分都给你:)
 
兄弟,如果好用的话,我100分都给你:)
email:jinkaizh@ynmail.com
 
我也遇到过这样的问题,很奇怪,只要在自己的两个窗口之间点几下,就会失去
ALWAYSONTOP特性,我用下面的方法搞定的:
unit1:
unit Unit1;

interface

uses
; Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
; StdCtrls;

type
; TForm1 = class(TForm)
; ; Button1: TButton;
; ; procedure Button1Click(Sender: TObject);
; ; procedure FormCreate(Sender: TObject);
; private
; ; { Private declarations }
; public
; ; { Public declarations }
; ; procedure AppDeactivate(Sender:TObject);
; end;

var
; Form1: TForm1;

implementation

uses Unit2;

{$R *.DFM}

procedure TForm1.AppDeactivate(Sender:TObject);
begin
SetWindowPos(Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE or SWP_NOMOVE);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
form2.show;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
; application.OnDeactivate :=AppDeactivate;
end;

end.


unit2:
unit Unit2;

interface

uses
; Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;

type
; TForm2 = class(TForm)
; ; procedure FormShow(Sender: TObject);
; private
; ; { Private declarations }
; public
; ; { Public declarations }
; end;

var
; Form2: TForm2;

implementation

uses Unit1;

{$R *.DFM}

procedure TForm2.FormShow(Sender: TObject);
begin
SetWindowPos(Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE or SWP_NOMOVE);
end;

end.
 
简单,一个函数就可以搞定
 
procedure Tform1.exDrawWnd(curHwnd: HWND; topMode: Boolean);
begin
; if topMode then
; ; SetWindowPos(curHwnd,
; ; ; HWND_TOPMOST,
; ; ; 0, 0, 0, 0,
; ; ; SWP_NOMOVE or SWP_NOSIZE or SWP_NOACTIVATE)
; else
; ; SetWindowPos(curHwnd,
; ; ; HWND_NOTOPMOST,
; ; ; 0, 0, 0, 0,
; ; ; SWP_NOMOVE or SWP_NOSIZE or SWP_NOACTIVATE);
end;
调用语句:exDrawWnd(windowhanle, true);
你好像少了个"SWP_NOACTIVATE"!!!
 
; ;我最近也碰到了这个问题,Delphi帮助中说如果两个窗口同时设置了fsStayOnTop时,
那么谁都将不会呆在最前面。
; ; 而且,我还发现,好像只有主窗口设置fsStayOnTop才有效,其它窗口就算设置了也
没有效果!
; ; 难道真的没有办法吗?
 
bringupwindowtop(yourwindow.handle);
 
jqw: 搞笑?
找不到bringupwindowtop()在哪里呀?
 
多人接受答案了。
 

Similar threads

后退
顶部