【问题标题】:Delphi messagebox appearing behind other formDelphi 消息框出现在其他表单后面
【发布时间】:2011-11-04 09:55:21
【问题描述】:

我正在使用下面的代码在 Delphi 7 中创建一个消息框。但是我在屏幕上还有另一个表单 FormStyle 设置为 fsStayOnTop 并且消息框出现在此表单后面。

有什么办法可以强制消息框出现在前面?

    if Application.MessageBox('Amessage here','Title', +MB_APPLMODAL + MB_ICONQUESTION + MB_YESNO) = IDNO then

【问题讨论】:

  • 避免使用Application.MessageBox。而是使用 WinAPI MessageBox 函数并将其传递给最顶层表单的 HWND。此外,您可以使用MB_TASKMODAL 标志来确保对话框将弹出在所有其他表单之上。

标签: delphi delphi-7 messagebox


【解决方案1】:

在显示消息框之前致电NormalizeTopMosts

使用 NormalizeTopMosts 允许消息框或对话框 使用 Windows API 函数(例如 MessageBox 和 MessageDlg) 直接出现在最顶层表单的顶部。否则 最上面的表单仍然在最上面,并且可能会遮挡消息框。

(希望它在 Delphi 7 中可用。)

编辑:不确定是否投反对票。如果它暗示 OP 应该使用本机 MessageBox 函数并将其父 HWND 设置为最顶层窗口 - 我会同意。但也许由于某种原因这是不可能的。

【讨论】:

  • 嗯。到目前为止,对所有 3 个答案都投了反对票,没有任何解释/理由。不知道这是怎么回事。 SO 没有“肇事逃逸”徽章。
  • 没有任何暗示,这些反对票是如此毫无意义。为徽章 +1 :)
  • 我没有看到反对票,但是如前所述,这可能是因为问题专门询问了有关使用 application.messagebox - 在 windows.messagebox 之前该方法中有很多代码称为 - 主要处理多个监视器和任务窗口。替换问题中指定的当前调用可能会导致环境中出现不良结果。
【解决方案2】:

Windows.pas你可以找到更多MessageBox()的标志:

MB_APPLMODAL = $00000000;
MB_SYSTEMMODAL = $00001000;
MB_TASKMODAL = $00002000;

MessageBox documentation了解他们

您甚至可以使用MB_TOPMOST 标志。

【讨论】:

    【解决方案3】:

    尝试使用 MB_TASKMODAL 标志而不是 MB_APPLMODAL。

    【讨论】:

      猜你喜欢
      • 2020-11-30
      • 2012-08-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-27
      • 1970-01-01
      相关资源
      最近更新 更多