gpt4 book ai didi

Delphi - 如何找出哪个模式对话框具有焦点并将其置于前面?

转载 作者:行者123 更新时间:2023-12-03 14:52:29 25 4
gpt4 key购买 nike

我有一个 Delphi 2006 应用程序,它可以弹出一个模式对话框来响应错误情况。它似乎进入了一种状态,其中一个模式对话框处于打开状态,位于主窗体前面,但两个窗体都不响应消息。单击任一按钮都会发出“bonk”声。该应用程序运行良好,UI 正在更新主窗体,但您无法执行任何操作。我想主窗体下很可能还有另一个模式对话框。我不知道它是我的还是 Windows 的。

其他要点:

  • 应用程序对键盘快捷键的响应正常。其中一个快捷方式可以优雅地关闭应用程序,这很有效。从那时起我就无法重现这种情况。
  • 该应用程序有一个托盘图标。这响应鼠标右键单击。如果我从这里最小化应用程序,主窗体将最小化并保留显示模式对话框,但仍然没有焦点。如果我恢复主窗体,一切都会像原来一样,两个窗口都没有焦点。 Alt-tab 也有类似的结果。
  • 平台是 Windows 7
  • 我在创建任何表单之前调用DisableProcessWindowsGhosting
  • 我打开模式对话框

    ModalDialog.PopupParent := MainForm ;
    ModalDialog.ShowModal ;
  • 如果其他模式对话框打开,我会推迟这些错误对话框:

    if (Application.ModalLevel = 0) then
    {open modal dialog}

我的问题分为两部分:

有没有一种方法可以以编程方式找出哪个窗口具有焦点?然后我可以针对这种情况采取一些操作,或者作为最后的手段,我可​​以提供一个快捷键将其带到前面或采取一些规避操作(取决于对话框),例如将 ModalResult 设置为 mrCancel。

怎么会出现这种情况呢?通常,当我在主窗体后面得到一个模式对话框时(我可以通过打开模式对话框,从托盘图标最小化应用程序,然后再次恢复应用程序来做到这一点 - 应用程序主窗体在对话框前面恢复,对话框仍然保留焦点),我可以通过单击托盘图标再次将其置于前面,或者使用 Esc 键将其关闭,但在这种情况下不起作用。

**更新**

Misha 的修复与 TSaveDialog 等非 Delphi 对话框无关。通过在调用 Execute 之前添加 Application.ModalPopupMode := pmAuto ;,我也能够让它们正常工作。

我所说的“让它工作”是指保存对话框在以下序列之后位于前面:

  • 打开保存对话框
  • 从托盘图标最小化应用
  • 从托盘图标恢复应用

而它位于主窗体后面,没有 ModalPopupMode := pmAuto

所以我希望这些改变能够帮助解决(尚未重现的)问题。

最佳答案

如果具有焦点的窗体(Form1)响应消息的时间过长,以致 Windows 认为 Form1 无响应,然后 Form1 显示模态窗体(Form2),在 Form2 显示后应用程序再次处理消息,Form1 将被带到前面,从而有可能“覆盖”Form2。

将其放入 Application.OnIdle 事件即可解决问题:

  if Assigned(Screen.ActiveForm) then
begin
if (fsModal in Screen.ActiveForm.FormState) and
(Application.DialogHandle <= 0)) then
begin
Screen.ActiveForm.BringToFront;
end;
end;

关于Delphi - 如何找出哪个模式对话框具有焦点并将其置于前面?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9811940/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com