我想要一个表单,当我设置在z顺序的底部时它停留在那里。我试过了:
SetWindowPos(Handle,HWND_BOTTOM,Left,Top,Width,Height,SWP_NOZORDER);
当我与其他应用程序重叠时,它会根据需要保留在底部。但是,当我点击它时,它会升到顶部。然后我尝试了:
SetWindowPos(Handle, HWND_BOTTOM, Left, Top, Width, Height,
SWP_NOACTIVATE or SWP_NOZORDER);
以及本网站的其他各种开关...... http://msdn.microsoft.com/en-us/library/ms633545.aspx
但它仍然升至顶峰。
答案 0 :(得分:8)
SetWindowPos
仅在调用窗口时才设置窗口的位置,它不会建立状态。处理WM_WINDOWPOSCHANGING
是正确的方法:
正在处理此消息,修改其中的任何值 WINDOWPOS会影响窗口在Z中的新大小,位置或位置 订购。应用程序可以通过设置或阻止更改窗口 清除WINDOWPOS的flags成员中的相应位。
type
TForm1 = class(TForm)
..
private
procedure WindowPosChanging(var Msg: TWMWindowPosMsg);
message WM_WINDOWPOSCHANGING;
end;
..
procedure TForm1.WindowPosChanging(var Msg: TWMWindowPosMsg);
begin
if Msg.WindowPos.flags and SWP_NOZORDER = 0 then
Msg.WindowPos.hwndInsertAfter := HWND_BOTTOM;
inherited;
end;
答案 1 :(得分:1)
从未尝试过,但你可能会在某处捕获WM_WINDOWPOSCHANGING消息,然后用Z顺序进行调整。可能会变得复杂,我个人会发现它非常不合标准。
一个菜单选项相当于cacsade但是有一个z顺序排序可能是一个更好的选择,我的意思是如果他们点击它,他们希望看到它。
答案 2 :(得分:0)
出于本能,我不相信该应用程序将始终按预期工作。其他应用程序可能有更严格的方法强行将其自身带到您的面前,反之亦然,将其发送到后面。例如,一个重复将窗口发送到后面的计时器。然后,如果你有两个这样的应用程序分层,你会看到它们互相争斗,基本上是来回闪烁。最后,我不会指望永久100%的解决方案,因为你永远不知道其他应用程序可能做什么来覆盖你的。