2008-11-12 124 views
4

我有一个定时器在我的Delphi MDI应用程序中运行,我想用它弹出一条消息,如果在后台发生了变化。但是当应用程序在前台有一个模态对话框时,我不想让这个消息弹出来,因为用户无法做任何事情。如何发现我的delphi应用程序当前是否有模态窗口?

所以我想知道的是如何检查我的应用程序中是否存在模态对话框?

回答

8

您可以尝试使用此代码:

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

    end; 
end; 

我用Delphi 4进行测试,对我的作品。

[编辑]:但是你真的应该考虑是否弹出窗体并偷取焦点是一个好主意。这取决于您的应用程序,但是如果用户正在将某些内容输入到编辑字段中,或者使用鼠标进行操作,那么这可能会破坏他们的工作流程。

+0

对,在这种情况下,用户可以选择不接收弹出窗口,并且默认设置为不是。 – 2008-11-13 14:19:40

2

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

+0

感谢您的评论,我同意。 – 2008-11-12 19:40:27

6

自从2005年德尔福以来,您在TApplication上拥有一个ModalLevel属性。它计算在应用程序中打开的Modal表单的数量。

+0

这很酷,过来告诉我的老板升级! – 2008-11-13 14:21:10

+0

还有一些事件:TApplication.OnModalBegin和TApplication.OnModalEnd(请参阅此问题http://stackoverflow.com/questions/3306260/delphi-detecting-if-my-app-has-a-modal-dialog-open ) – Name 2010-09-01 12:37:27

2

使用AnyPopup()函数

关于GetLastActivePopup()。它可能返回值与hWnd参数相同

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