拦截CDialog创建

时间:2011-03-10 17:25:48

标签: windows user-interface mfc cdialog

我有一个相当大的应用程序,显示许多不同的MFC CDialog派生的对话框窗口。所有对话框都显示在与此类似的中央函数中:

void ShowDialog(CDialog& dlg)
{
  dlg.DoModal();
}

现在我需要在每个对话框的OnInitDialog方法中调用一个函数。它在技术上不需要在OnInitDialog中,但最好在对话框可见之前。

强力方法是遍历代码并找到每个最后一个对话框并将函数调用添加到OnInitDialog方法(如果它有一个,如果没有,则添加一个)。但似乎必须有更优雅的方式......

请注意,dlg实际上不是CDialog,而是源自它的东西。

任何想法,诡计或黑客行为?我不是要修补消息地图,而是希望找到更清洁/更安全的东西。

2 个答案:

答案 0 :(得分:1)

如果你的所有对话框都有一个共同的祖先,你似乎暗示了它,那么你可以简单地将代码放在你选择的合适位置的共同祖先中。例如OnInitDialog()是虚拟的。

答案 1 :(得分:-1)

事实证明这很容易做到:

HHOOK gPrevHook = SetWindowsHookEx(WH_CALLWNDPROCRET, HookProc, NULL, myGUIThreadID);


LRESULT CALLBACK HookProc(int nCode, WPARAM wParam, LPARAM lParam)
{
    if(NULL != wParam)
    {
         CWPRETSTRUCT* pS = (CWPRETSTRUCT*)lParam;
         if(WM_INITDIALOG == pS->message)
             CallFuncOnWindow(pS->hwnd);
    }

    return CallNextHookEx(gPrevHook, nCode, wParam, lParam);
}

可能不是高性能应用程序要做的事情,但对于一个简单的GUI,它可以很好地工作。无需更改其他代码。