我有一个由一个主窗口组成的应用程序和一个我希望在所有其他应用程序之上的弹出窗口。我们打电话给#34;窗口A"到主窗口,"窗口B"到顶部弹出窗口和"窗口C"到另一个应用程序的窗口。
我使用此代码将窗口B设置在顶部:
SetWindowPos(Handle, HWND_TOPMOST, 0, 0, 0, 0,
SWP_NoMove or SWP_NoSize);
这可以正常工作,我可以打开另一个应用程序(Window C),Window B保持在最前面。但是,如果我点击它的窗口标题"窗口A"将#34; Window C"放在前面。有没有办法在单击Window B的任何部分时阻止主窗口(窗口A)显示在前面?
答案 0 :(得分:5)
要让“窗口B”始终位于顶部,您可以将其FormStyle
属性设置为fsStayOnTop
,而无需致电SetWindowPos
。在任何窗口中覆盖CreateParams
以使其无主,以便在激活时不会将其所有者带到前面。
type
TWindowB = class(TForm)
procedure FormCreate(Sender: TObject);
protected
procedure CreateParams(var Params: TCreateParams); override;
end;
procedure TWindowB.CreateParams(var Params: TCreateParams);
begin
inherited;
Params.WndParent := 0;
end;
procedure TWindowB.FormCreate(Sender: TObject);
begin
FormStyle := fsStayOnTop;
end;
对于普通窗口(例如BorderStyle
= bsSizeable
),您将有一个任务栏按钮和“窗口B”的Alt + Tab图标。这是正常的,因为窗口现在不依赖于任何其他窗口进行激活,它应该有激活它的方法。为避免这种情况,您可以将bsToolWindow
或bsSizeToolWin
设置为BorderStyle
,或将隐藏的应用程序窗口设置为窗口所有者,方法是将Application.Handle
设置为Params.WndParent
。
请注意,最顶层的窗口与其他可能的最顶层窗口没有任何优先级,其中任何一个窗口都可能被放在前面。