【问题标题】:Delphi - detecting if my app has a modal dialog openDelphi - 检测我的应用程序是否打开了模式对话框
【发布时间】:2010-07-22 06:22:56
【问题描述】:

我有一个 Delphi 2006 应用程序,当检测到错误情况时会弹出一个模式警报对话框。由于错误条件的检查是在空闲处理程序中完成的,因此如果碰巧显示了另一个模式对话框,则该对话框可以弹出到另一个模式对话框的顶部。这可能会导致用户感到困惑,即在关闭警报对话框后应用程序主窗体没有获得焦点,因为这是另一个模糊的模态对话框。

我想做的是在应用打开任何模态对话框时推迟弹出警报。

我尝试了 GetLastActivePopup (MyMainWindow.Handle),但它似乎一直返回非零值。

【问题讨论】:

标签: delphi forms modal-dialog showmodaldialog


【解决方案1】:

【讨论】:

  • 谢谢拉尔斯。似乎是一种享受。我想如果 D2006 帮助系统不是那么狗,我自己就有机会找到这些东西。
【解决方案2】:

只是测试

if not IsWindowEnabled(MyMainWindow.Handle) then

这也可以处理非 Delphi 对话框处于模态时的情况,例如 windows.MessageBox(Handle...。或者一个通用对话框正在显示(即一个TOpenDialog)。

【讨论】:

  • 不幸的是,如果非 Delphi 对话框以模态方式打开,我会丢失 Application OnIdle 调用,因此无论如何应用程序都会被有效冻结。
  • ProcessMessages() 不处理“冻结”问题,rossmcm ?
【解决方案3】:

使用AnyPopup() 函数

关于GetLastActivePopup()。可能返回值和hWnd参数一样

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

【讨论】:

  • AnyPopup +1;还请将该答案添加到stackoverflow.com/questions/284581/… 注意我已经稍微编辑了您的答案以指向您提到的功能的在线文档。
  • @Jeroen:AnyPopup 文档状态:This function is provided only for compatibility with 16-bit versions of Windows. It is generally not useful. 那么不值得推荐...?
  • @Marjan 使用 GetLastActivePopup(hWnd) 并将其结果与 hWnd 进行比较
  • @Marjan:我以为我确实评论了“AnyPopup/GetLastActivePopup”,但我急于离开客户并没有进行足够的检查。感谢您就 AnyPopup 弃用问题纠正我。
  • @Jeroen:不用担心,很高兴。那又是什么话“快的速度很少好”?翻译得不是很好吗?
猜你喜欢
  • 1970-01-01
  • 2011-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-19
  • 1970-01-01
相关资源
最近更新 更多