【问题标题】:Delphi Window on Top of all other apps while main window belowDelphi 窗口位于所有其他应用程序的顶部,而主窗口位于下方
【发布时间】:2016-11-08 15:15:15
【问题描述】:

我有一个由一个主窗口和一个弹出窗口组成的应用程序,我希望它位于所有其他应用程序之上。让我们将“Window A”称为主窗口,将“Window B”称为顶部弹出窗口,将“Window C”称为另一个应用程序的窗口。

我正在使用此代码将窗口 B 设置在顶部:

    SetWindowPos(Handle, HWND_TOPMOST, 0, 0, 0, 0,
                 SWP_NoMove or SWP_NoSize);

这按预期工作,我可以打开另一个应用程序(窗口 C)并且窗口 B 保持在顶部。但是,如果我点击它的窗口标题,“窗口 A”就会出现在“窗口 C”之上。单击窗口 B 的任何部分时,有没有办法防止主窗口(窗口 A)显示在前面?

【问题讨论】:

  • 窗口 A 是否归窗口 B 所有?
  • 覆盖 B 的 CreateParams 以设置 WndParent = 0。在这里问了很多次。顺便说一句,您可以使用 fsStayOnTop 作为 FormStyle。
  • 显然您无法在所有其他窗口之上。你会输给其他想要做同样事情的窗口。在 Win32 意义上,A 可能是 B 的所有者。按照 Sertac 的说法,让 B 成为无主。
  • 如果这里被问了很多次,@Sertac,那么您能否投票以将其作为重复项关闭,而不是在评论中给出答案?
  • 不可能保证 100%,因为肯定会有其他应用程序与您的职位竞争,谁会脱颖而出。有点像这些选举...

标签: delphi winapi


【解决方案1】:

要让“Window 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 图标。这是正常的,因为窗口现在不依赖于任何其他窗口来激活,它应该有激活它的方法。为避免这种情况,您可以将bsToolWindowbsSizeToolWin 用作BorderStyle,或者通过将Application.Handle 设置为Params.WndParent 来将隐藏的应用程序窗口用作窗口所有者。

请注意,最顶层窗口没有任何优先级高于其他可能的最顶层窗口,它们中的任何一个都可能被置于前面。

【讨论】:

    猜你喜欢
    • 2018-07-17
    • 1970-01-01
    • 2018-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-26
    • 1970-01-01
    相关资源
    最近更新 更多