MFC中模态对话框的检测

MFC中模态对话框的检测,mfc,modal-dialog,Mfc,Modal Dialog,如何以编程方式检测MFC应用程序当前是否显示模式对话框或属性表?目前我正在使用以下代码,但我觉得代码也会触发无模式对话框 bool HasModalDialog(const CWnd* pWnd) { const CWnd* pChildWnd = pWnd ? pWnd->GetNextWindow(GW_HWNDPREV) : NULL; while (pChildWnd) { if (pWnd == pChildWnd->GetTopLevelPa

如何以编程方式检测MFC应用程序当前是否显示模式对话框或属性表?目前我正在使用以下代码,但我觉得代码也会触发无模式对话框

bool HasModalDialog(const CWnd* pWnd)
{
   const CWnd* pChildWnd = pWnd ? pWnd->GetNextWindow(GW_HWNDPREV) : NULL;
   while (pChildWnd)
   {
      if (pWnd == pChildWnd->GetTopLevelParent() &&
         (pChildWnd->IsKindOf(RUNTIME_CLASS(CDialog)) ||
         pChildWnd->IsKindOf(RUNTIME_CLASS(CPropertySheet))))
      {
         return true;
      }

      pChildWnd = pChildWnd->GetNextWindow(GW_HWNDPREV);
   }

   return false;
}
用法:

HasModalDialog(AfxGetMainWnd())

有人找到了检测模式对话框的替代方法吗?

如果您只检测应用程序中的窗口,那么您可以派生自己的CDialog和CPropertySheet,并在其中放置一个简单的布尔值,以跟踪它是否为模式对话框

bool HasModalDialog(const CWnd* pWnd)
{
   const CWnd* pChildWnd = pWnd ? pWnd->GetNextWindow(GW_HWNDPREV) : NULL;
   while (pChildWnd)
   {
      if (pWnd == pChildWnd->GetTopLevelParent() )
      {
         if ( pChildWnd->IsKindOf(RUNTIME_CLASS(CMyDialog) )
         {
             return ((CMyDialog*)pChildWnd)->IsModal();
         }

         if ( pChildWnd->IsKindOf(RUNTIME_CLASS(CMyPropertySheet) )
         {
             return ((CMyPropertySheet*)pChildWnd)->IsModal();
         }
      }
      pChildWnd = pChildWnd->GetNextWindow(GW_HWNDPREV);
   }

   return false;
}
一定有别的办法,但那是我脑子里唯一能想到的办法。

你试过了吗

我还没有测试它是否只适用于模态对话框


编辑1:根据,
GetLastActivePopup
应返回当前活动模式对话框


编辑2:检索当前模式窗口的另一种方法可能是修改代码以检查禁用的父/所有者-模式对话框应始终在显示之前显示。

我尝试了许多方法来解决这个问题,为什么我需要它,因为我正在处理的代码将所有对话框声明为在heapmemory中分配的指针(TDialog*d=new TDialog)。这是OWL代码,我将其转换为MFC,我想自动删除这些指针,只有当对话框是模态的,并且没有在堆中分配时,因此,我需要检查它。我的解决方案很容易在继承的类中重写DoModal,并将标志isModal设置为true。如果没有使用DoModal显示,则标志isModal在构造函数中初始化时仍将为null

class  : public CDialog
{
    private:
        bool isModal
    public:
        CMyDlg(int id, CWnd* parent = NULL) : CDialog(id, parent), isModal(false)
        {

        }

        virtual INT_PTR DoModal()
        {
            isModal = true;
            return CDialog::DoModal();//return __super::DoModal();
        }

        bool IsModal()
        {
            return isModal;
        }

        virtual void OnCancel()
        {
            if(isModal)
            {
                CDialog::OnCancel();
            }
            else
            {
                DestroyWindow();
            }
        }

        virtual void OnOk()
        {
            if(isModal)
            {
                CDialog::OnCancel();
            }
            else
            {
                DestroyWindow();
            }
        }
        virtual void PostNcDestroy()
        {
            delete this;
        }
}

我看不出你的代码实际上是如何检测模态对话框的。如果CDialog或CPropertySheet是“Create”d,那么它将是非模态的,并且您的代码仍将返回true。@Goz:这就是代码所遇到的问题。不幸的是,这要求所有对话框都从这些新类派生,而这对MFC中已经存在的对话框类不起作用。事实上不是这样。你也必须为他们制作自己的类包装。。。那将是一个地狱般的假货…“检查一个残疾的父母/所有者”-我只是在想同样的事情。