网上说,MFC的消息路由和消息反射的过程是通过:oldWndProc = (WNDPROC)SetWindowLongPtr(hWnd, GWLP_WNDPROC,(DWORD_PTR)afxWndProc);
AfxHookWindowCreate调用::SetWindowHookEx为窗口设置了一个WH_CBT类型的钩子来过滤消息,并把过滤函数设置成_AfxCbtFilterHook
_AfxCbtFilterHook通过窗口子类化设置窗口的窗口过程为AfxWndProc我的问题是,既然可以很方便的做到子类化,为什么还要设置一个严重降低系统效率的消息钩子,来过滤消息?MFC这样设计的好处是什么?
AfxHookWindowCreate调用::SetWindowHookEx为窗口设置了一个WH_CBT类型的钩子来过滤消息,并把过滤函数设置成_AfxCbtFilterHook
_AfxCbtFilterHook通过窗口子类化设置窗口的窗口过程为AfxWndProc我的问题是,既然可以很方便的做到子类化,为什么还要设置一个严重降低系统效率的消息钩子,来过滤消息?MFC这样设计的好处是什么?
解决方案 »
- TCP 3次握手的问题
- 关于CListCtrl双击后关闭的问题,奇怪的问题,困扰多久,请指教!
- 请问如何将CTREECTRL的根部结点隐藏,以及如何在某一层结点前加复选框?
- The application failed to initialize properly(0xc015004).
- 我的STL与SDK冲突的解决方法里有一条:"而且还要保证 Microsoft Platform SDK 的搜索路径必须在 STLport 和 MSVC 自己的搜索路径之前",
- 发布一个EMF图像文件查看分析工具
- 70分问个VC使用的简单问题
- 请问有没有可以换皮肤的tabcontrol??
- 200分,请教在VC下如何模拟键盘输入汉字
- 预处理问题!
- Windows下面的Mutex到底分为几种?
- 为什么SetWaitableTimer的参数LARGE_INTEGER要制定一个负数? 不明白
我只知道不能这样做的一个原因:
钩子是进程有效的,通过资源创建控件时,是没有AfxHookWindowCreate的,但是控件创建时却能触发钩子,如果
卸钩,控件无法子类化了啊。
对当前应用程序,相当于把所有的消息都从一个出口,传递给所有处理消息的函数。
主要是方便各个继承类处理对应的消息,以及消息的分发。也就是完成了楼上说的
消息路由!
问题: 如果不用SetWindowHookEx,那么所有的消息可能有多个出口?我怎么觉得线程就一个消息队列,怎么会有多个消息出口呢?疑惑。
仅用SetWindowLongPtr不用钩子的话,窗口创建过程中的消息如WM_CREATE、WM_NCCREATE就无法由子类化的窗口函数处理