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

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

 2006-07-20 11:42:41 来源:WEB开发网   
核心提示: 当 Windows 调用 CBT 钩子时,它用 WPARAM 传递 HWND,安装钩子,托管C++中的字符串及其它(2),但 MFC 是如何知道要附属哪个 CWnd 派生对象呢?通过一个全局变量,为了创建窗口,MFC 知道使用哪个 CWnd,因为它之前已经将 CWnd 指针保存在 pThr

当 Windows 调用 CBT 钩子时,它用 WPARAM 传递 HWND。但 MFC 是如何知道要附属哪个 CWnd 派生对象呢?通过一个全局变量。为了创建窗口,你必须调用 CWnd::Create 或 CWnd::CreateEx。前者调用后者,所以不管怎样都要经过 CWnd::CreateEx 调用。在创建窗口之前, CWnd::CreateEx 安装 CBT 钩子并设置全局变量。代码是这样的:

// 来自 wincore.cpp 的简化代码
BOOL CWnd::CreateEx(...)
{
  AfxHookWindowCreate(this);
  ::CreateWindowEx(...);
  AfxUnhookWindowCreate();
  return TRUE;
}

AfxHookWindowCreate 安装 CBT 钩子 _AfxCbtFilterHook。它还在线程状态中保存窗口对象指针,pThreadState->m_pWndInit。

void AFXAPI AfxHookWindowCreate(CWnd* pWnd)
{
  _AFX_THREAD_STATE* pThreadState = _afxThreadState.GetData();
  pThreadState->m_hHookOldCbtFilter = ::SetWindowsHookEx(
  WH_CBT, _AfxCbtFilterHook, NULL, ::GetCurrentThreadId());
  pThreadState->m_pWndInit = pWnd;
}

考虑到线程状态是一个保存线程级全局变量的地方。所以这个动作点到为止。你的程序调用 CWnd::Create 或者 CWnd::CreateEx。CWnd::CreateEx 安装 CBT 钩子,将一个全局指针赋值给所创建的 CWnd,并且最终调用 ::CreateWindowEx 来真正创建窗口。在创建窗口之后,发送 WM_CREATE 或 WM_GETMINMAXINFO 之类的窗口消息之前—— Windows 用 HCBT_CREATEWND 调用 CBT 钩子。然后 _AfxCbtFilterHook 获得控制并子类化该窗口并将它连接到其 CWnd,MFC 知道使用哪个 CWnd,因为它之前已经将 CWnd 指针保存在 pThreadState->m_pWndInit 中了。很聪明,不是吗?

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

Tags:安装 钩子 托管

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