SetWindowsHookEx在嵌套窗口中阻止WM_ERASEBKGND

时间:2013-02-26 16:59:10

标签: mfc setwindowshookex

我有以下MFC应用程序UI结构:

Main Frame
- CView derived class
 - CWnd derived class
 --- CMFCTabCtrl derived class
 ---- CDialog derived class

CMFCTabCtrl可以依次保存CWnd派生类等等......

如果您将其视为一个窗口树,请将上面定义为深度为0。

当树的深度为1时,会出现问题,这意味着:

Main Frame
- CView derived class
 - CWnd derived class
 --- CMFCTabCtrl derived class
 ----- CWnd derived class
 ------- CMFCTabCtrl derived class
 -------- CDialog derived class

我在应用程序中添加了以下代码:

extern HHOOK hHook = nullptr;
LRESULT CALLBACK HookProc(int nCode, WPARAM wParam, LPARAM lParam)
{
    return CallNextHookEx(hook, nCode, wParam, lParam);
}
hHook = SetWindowsHookEx(WH_CALLWNDPROC, &HookProc, AfxGetInstanceHandle(), GetCurrentThreadId());

然后我运行了应用程序并调整了主框架的大小,我注意到以下内容:

  1. 如果树深度为0,则会在对话框中收到WM_ERASEBKGND消息。
  2. 如果树深为1,则对话框中未收到WM_ERASEBKGND消息。
  3. 我希望我的解释很清楚。

    设置钩子会以如此戏剧性的方式影响行为似乎很奇怪。

    你们之前是否遇到过这类问题?

1 个答案:

答案 0 :(得分:0)

我想我发现了这个问题。 每次我们调整下一个嵌套窗口的大小时,内核堆栈都会增加,直到它没有enougth堆栈来调用wndproc并且我们停止接收消息。

更多细节可以在这里找到: http://blogs.msdn.com/b/alejacma/archive/2008/11/20/controls-won-t-get-resized-once-the-nesting-hierarchy-of-windows-exceeds-a-certain-depth-x64.aspx