如何发现我的delphi应用程序当前是否有模式窗口?

如何发现我的delphi应用程序当前是否有模式窗口?,delphi,modal-dialog,mdi,Delphi,Modal Dialog,Mdi,我在Delphi MDI应用程序中运行了一个计时器,如果背景发生变化,我想用它弹出一条消息。但是我不希望当应用程序在前台有一个模式对话框时弹出该消息,因为用户对此无能为力 因此,我想知道的是,如何检查应用程序中是否存在模式对话框?您可以尝试使用以下代码: var ActForm: TCustomForm; begin ActForm := Screen.ActiveForm; if (ActForm = nil) or not (fsModal in ActForm.FormStat

我在Delphi MDI应用程序中运行了一个计时器,如果背景发生变化,我想用它弹出一条消息。但是我不希望当应用程序在前台有一个模式对话框时弹出该消息,因为用户对此无能为力


因此,我想知道的是,如何检查应用程序中是否存在模式对话框?

您可以尝试使用以下代码:

var
  ActForm: TCustomForm;
begin
  ActForm := Screen.ActiveForm;
  if (ActForm = nil) or not (fsModal in ActForm.FormState) then begin

  end;
end;
我用Delphi4进行了测试,对我来说很有用


[编辑]:但你应该认真考虑是否弹出一个表单并窃取焦点是一个好主意。这取决于您的应用程序,但如果用户当前正在编辑字段中输入某些内容,或使用鼠标执行某些操作,则可能会中断他们的工作流程。

也许解决方案是实际弹出一个不会窃取焦点的提示。一个可点击的提示,在某个地方可见,但不太具有侵入性。因此,如果用户想要采取行动,他们可以,或者他们可以完成他们正在做的事情,然后采取行动。或者完全忽略它。

自Delphi 2005以来,您在TApplication上拥有一个属性。它统计应用程序中打开的模式表单的数量。

今天,用户正确地回答说,仅仅监视模式Delphi表单是不够的;窗口也可以有模式对话框

他告诉你如何检查

--jeroen使用()函数

关于()。在以下情况下,它可能返回与hWnd参数相同的值:

  • hWnd标识的窗口最近处于活动状态
  • 由hWnd标识的窗口不拥有任何弹出窗口
  • hWnd标识的窗口不是顶级窗口,或者它属于另一个窗口

是的,在这种情况下,用户可以选择不接收弹出窗口,默认设置为不接收。还有几个事件:TApplication.OnModalBegin和TApplication.OnModalEnd(参见此问题)@Peter我想你的老板会在接受的答案中简单地指出免费解决方案;)