WEB开发网
开发学院软件开发VC 安装钩子,托管C++中的字符串及其它 阅读

安装钩子,托管C++中的字符串及其它

 2006-07-20 11:42:41 来源:WEB开发网   
核心提示: 在 _AfxCbtFilterHook 将控制返回Windows 之后,通过将控制交给 OnGetMinMaxInfo 和 OnCreate 处理例程,安装钩子,托管C++中的字符串及其它(3),Windows 向你的窗口发送 WM_GETMINMAXINFO 和 WM_CREATE 消息

在 _AfxCbtFilterHook 将控制返回 Windows 之后,通过将控制交给 OnGetMinMaxInfo 和 OnCreate 处理例程,Windows 向你的窗口发送 WM_GETMINMAXINFO 和 WM_CREATE 消息,MFC 按常规方式处理它们。这是必由之路,因为 HWND 已经被附属到其 CWnd 对象。当 ::CreateWindowEx 将控制返回给 CWnd::CreateEx 的时候,CWnd::CreateEx 调用 AfxUnhookWindowCreate 删除 CBT 钩子并将 pThreadState->m_pWndInit 置为 NULL。之所以要这样处理 CBT,其唯一的理由就是为了监控窗口的创建,以便 MFC 能将 CWnd 连接到它们的 HWNDs,这个钩子只为 ::CreateWindowEx 调用过程而存在。

机敏的读者可能会问:为什么 MFC 要费那么大的劲——为什么不在 CWnd::CreateEx 中直接附属并子类化窗口?那样做也行得通,只是会有一个问题。CWnd 对象将错过任何从 ::CreateWindowEx 发送的消息——如:WM_GETMINMAXINFO、WM_NCCREATE 以及 WM_CREATE。这个问题的来由是这样的:在创建窗口时 ::CreateWindowEx 无法让你指定窗口过程。你必须在之后进行子类化。但是另一方面,几个消息都已发出。为了处理这些消息,包括早先创建的消息,MFC 不得不在消息被发送之前连接到窗口对象。唯一途径就是使用 CBT 钩子,因为 Windows 正是在它创建窗口之后,发送任何消息之前调用该 CBT 钩子。所以说到底,CBT 钩子的目的是监视窗口的创建,以便在该窗口接收到任何消息之前将 CWnd 对象连接到它们的 HWNDs。

其实要回答你的问题不需要这么罗嗦,之所以讲这么多主要是为了更好地理解什么时候,在哪里使用 CBT 钩子以及 MFC 为什么使用 CBT 钩子。我还想向你展示 MFC 如何用线程全局变量 m_pWndInit 向钩子函数传递 CWnd 对象。你会经常遇到类似的处理。SetWindowsHookEx 不具备 void* 类型的参数向钩子函数传递信息。如果你的钩子过程需要这种形式的数据,唯一的方式是通过全局变量。其它的大多数情况只要一个常规静态变量即可;你不需要线程专用的全局变量,除非你的数据是线程专用的。MFC 使用线程状态,因为 它为每个线程维护一个单独的窗口映射。该窗口映射为线程保存所有的 CWnds 对象;从而我们能将每个 CWnd 与其 HWND 连接。

上一页  1 2 3 4 5 6 7 8  下一页

Tags:安装 钩子 托管

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接