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:利用 钩子 实现

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