WEB开发网
开发学院软件开发VC 利用钩子实现菜单阴影效果 阅读

利用钩子实现菜单阴影效果

 2008-01-19 20:25:26 来源:WEB开发网   
核心提示:HHOOK SetWindowsHookEx(int idHook, //钩子的类型,即它处理的消息类型 HOOKPROClpfn,//子函数的入口地址,利用钩子实现菜单阴影效果(2),当钩子钩到任何消息后先调用这个函数,// (如果dwThreadId参数为0,或是一个由别的进程创建的线程的标识,我们还需要额外做一点

HHOOK SetWindowsHookEx(int idHook, //钩子的类型,即它处理的消息类型      
  HOOKPROC  lpfn,
    //子函数的入口地址,当钩子钩到任何消息后先调用这个函数。    
    // (如果dwThreadId参数为0,或是一个由别的进程创建的线程的标识,
    //lpfn必须指向DLL中的钩子子程。除此以外,lpfn可以指向当前进
    //程的一段钩子子程代码)

  HINSTANCE  hMod, //应用程序实例的句柄。标识包含lpfn所指的子程的DLL。   
    // 如果dwThreadId标识当前进程创建的一个线程,
    //而且子程代码位于当前进程,hMod必须为NULL。
    //可以很简单的设定其为本应用程序的实例句柄。      
  DWORD  dwThreadId //与安装的钩子子程相关联的线程的标识符。
    //如果为0,钩子子程与所有的线程关联,即为全局钩子。
    //但这时,你钩子只能是放在DLL中。           
  );

函数成功则返回钩子子程的句柄,失败返回NULL。 我们用到的是WH_CALLWNDPROC类型的钩子,它使你可以监视发送到窗口过程的消息, 系统在消息发送到 接收窗口过程之前会调用你指定的WH_CALLWNDPROC Hook 子程,这样你就可以等它们自投罗网,然后就可以 对它们为所欲为了。 卸载钩子就简单多了,只需要调用UnhookWindowsHookEx即可,当然,我们还需要额外做一点清理工作:

void CMenuWndHook::UnInstallHook()
{
  POSITION pos = m_WndMenuMap.GetStartPosition();
  while (pos != NULL)
  {
    HWND hwnd;
    CMenuWndHook *pMenuWndHook;
    m_WndMenuMap.GetNextAssoc(pos, hwnd, pMenuWndHook);
    delete pMenuWndHook;
    pMenuWndHook= NULL;
  }
  
  m_WndMenuMap.RemoveAll();
  if (m_hMenuHook != NULL)
  {
    ::UnhookWindowsHookEx(m_hMenuHook);
  } 
}
  在介绍如何安装钩子时,提到要一个钩子子程,这个子程必须按下面的格式声明,否则不能使用:

上一页  1 2 3 4 5  下一页

Tags:利用 钩子 实现

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