网上说,MFC的消息路由和消息反射的过程是通过:oldWndProc  =  (WNDPROC)SetWindowLongPtr(hWnd, GWLP_WNDPROC,(DWORD_PTR)afxWndProc);
AfxHookWindowCreate调用::SetWindowHookEx为窗口设置了一个WH_CBT类型的钩子来过滤消息,并把过滤函数设置成_AfxCbtFilterHook
_AfxCbtFilterHook通过窗口子类化设置窗口的窗口过程为AfxWndProc我的问题是,既然可以很方便的做到子类化,为什么还要设置一个严重降低系统效率的消息钩子,来过滤消息?MFC这样设计的好处是什么?

解决方案 »

  1.   

    钩子实现了子类化,但是,实现完之后能否卸钩呢?
    我只知道不能这样做的一个原因:
    钩子是进程有效的,通过资源创建控件时,是没有AfxHookWindowCreate的,但是控件创建时却能触发钩子,如果
    卸钩,控件无法子类化了啊。
      

  2.   

    SetWindowHookEx 最后一个参数是当前线程ID时,对系统的效率没有影响!
    对当前应用程序,相当于把所有的消息都从一个出口,传递给所有处理消息的函数。
    主要是方便各个继承类处理对应的消息,以及消息的分发。也就是完成了楼上说的
    消息路由!
      

  3.   


    问题: 如果不用SetWindowHookEx,那么所有的消息可能有多个出口?我怎么觉得线程就一个消息队列,怎么会有多个消息出口呢?疑惑。
      

  4.   

    虽然可以直接调用SetWindowLongPtr子类化窗口,但显然必须是已经创建的窗口
    仅用SetWindowLongPtr不用钩子的话,窗口创建过程中的消息如WM_CREATE、WM_NCCREATE就无法由子类化的窗口函数处理