我有一个定时器在我的Delphi MDI应用程序中运行,我想用它弹出一条消息,如果在后台发生了变化。但是当应用程序在前台有一个模态对话框时,我不想让这个消息弹出来,因为用户无法做任何事情。如何发现我的delphi应用程序当前是否有模态窗口?
所以我想知道的是如何检查我的应用程序中是否存在模态对话框?
我有一个定时器在我的Delphi MDI应用程序中运行,我想用它弹出一条消息,如果在后台发生了变化。但是当应用程序在前台有一个模态对话框时,我不想让这个消息弹出来,因为用户无法做任何事情。如何发现我的delphi应用程序当前是否有模态窗口?
所以我想知道的是如何检查我的应用程序中是否存在模态对话框?
您可以尝试使用此代码:
var
ActForm: TCustomForm;
begin
ActForm := Screen.ActiveForm;
if (ActForm = nil) or not (fsModal in ActForm.FormState) then begin
end;
end;
我用Delphi 4进行测试,对我的作品。
[编辑]:但是你真的应该考虑是否弹出窗体并偷取焦点是一个好主意。这取决于您的应用程序,但是如果用户正在将某些内容输入到编辑字段中,或者使用鼠标进行操作,那么这可能会破坏他们的工作流程。
也许解决的办法是实际弹出一个不会窃取焦点的提示。一个可点击的提示可见,但不是太侵入。因此,如果用户想要采取行动,或者他们可以完成他们正在做的事情,然后采取行动。或者可能完全忽略它。
感谢您的评论,我同意。 – 2008-11-12 19:40:27
自从2005年德尔福以来,您在TApplication上拥有一个ModalLevel属性。它计算在应用程序中打开的Modal表单的数量。
这很酷,过来告诉我的老板升级! – 2008-11-13 14:21:10
还有一些事件: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
今天用户histrio正确回答another thread只是监测模态的Delphi表单不够; Windows也可以有模态对话框。
他的answer in another thread告诉你如何检查。
--jeroen
使用AnyPopup()函数
关于GetLastActivePopup()。它可能返回值与hWnd参数相同
对,在这种情况下,用户可以选择不接收弹出窗口,并且默认设置为不是。 – 2008-11-13 14:19:40