如果让两个窗体都在最前面...(100分)

C

caowei

Unregistered / Unconfirmed
GUEST, unregistred user!
快被搞死了 。。。。
Form1,里面有个按钮button1,按下后,显示form2。
要求:
1. form2在form1的上面,form1始终在桌面其他所有窗口的上面
2. form1和form2都不能最小化,即使按下任务栏的“显示桌面”。
我已经把DFW的文章查遍了,综合出的方法如下:
在两个FORM创建的时候均调用SetWindowPos(handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE);
为了使窗口不能被缩小,在Form1创建时调用:
SetWindowLong(Application.Handle, GWL_EXSTYLE, WS_EX_TOOLWINDOW);
结果:
所需要的两个功能均没有实现!如果不点button1,那么form1就是对的,即它总在最前面
而且不能被缩小,但是为什么一旦form2出来就都不对了呢???
怎么办呢????

procedure TForm1.FormCreate(Sender: TObject);
begin

SetWinDowLong(Application.Handle, GWL_EXSTYLE, WS_EX_TOOLWINDOW);
SetWindowPos(handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin

form2.show;
end;


procedure TForm2.FormCreate(Sender: TObject);
begin

SetWindowLong(Handle, GWL_EXSTYLE, WS_EX_TOOLWINDOW);
SetWindowPos(handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE);
end;

 
我看到这样一篇文章,希望对你有帮助
如果一个TOPMOST窗口不是MainForm的话,那么即将将它设为总在顶端,
它也会随着主窗口的前摆而前摆,后摆而后摆。那么怎么解决这个问题呢?

先将窗口的BorderStyle设为bsNone,FormStyle设为fsStayOnTop。

procedure TForm3.CreateParams(var Params:TCreateParams);

begin


inherited;

with Paramsdo


begin


Style:=Params.Style xor WS_DLGFRAME;

WndParent:=0;//此行

end;



end;




procedure TForm3.FormCreate(Sender: TObject);

begin


Width:=36;

Height:=36;

SetWindowLong(Handle,GWL_EXSTYLE,WS_EX_TOOLWINDOW);

end;


 
这样也不行...试验过了...
 
金山毒霸在杀毒的是被最小化之后,在屏幕上方有个状态条,
点“显示桌面”也不会最小化,但是假如同时你再开个MediaPlayer并且设置为"总在最前"
那么在这个时候再点“显示桌面”,连同毒霸的那个状态条,都会被最小化了。
不知道是什么原因。
我查找过论坛里所以的相关的帖子,也是没有找答案:(
 
也没看到过这方面的讨论,但是我要说的是:Windows 显示桌面使用的消息不是最小化
所有窗口,而是隐藏所有线程窗口。所以不理会 Windows 显示桌面命令的方法大概有:
1. 你的窗口不能有句柄,直接写 HDC ,2. 隔绝和 Windows 的所有消息通路。第二
个方案可不可用还没试呢,不过一般都是死机一种结果。
 
不能被最小化的窗体

procedure CreateParams(var Params: TCreateParams);override;

procedure TForm1.CreateParams(var Params: TCreateParams);
begin

inherited CreateParams( Params);
Params.ExStyle := Params.ExStyle or WS_EX_TOPMOST or WS_EX_TOOLWINDOW;
Params.WndParent := 0;
end;
 

Similar threads

顶部