小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

鉤子函數(shù)

 ShangShujie 2006-12-06

鉤子函數(shù)

鉤子函數(shù)可以截獲并處理其他應(yīng)用程序的消息。每當(dāng)特定的消息發(fā)出,在沒(méi)有到達(dá)目的窗口前,鉤子程序就先捕獲該消息,亦即鉤子函數(shù)先得到控制權(quán)。這時(shí)鉤子函數(shù)即可以加工處理(改變)該消息,也可以不作處理而繼續(xù)傳遞該消息,還可以強(qiáng)制結(jié)束消息的傳遞。
鉤子的種類(lèi)很多,每種鉤子可以截獲并處理相應(yīng)的消息,如鍵盤(pán)鉤子可以截獲鍵盤(pán)消息,外殼鉤子可以截取、啟動(dòng)和關(guān)閉應(yīng)用程序的消息等
關(guān)于HOOK
Hooks
A hook is a point in the system message-handling mechanism where an application can install a subroutine to monitor the message traffic in the system and process certain types of messages before they reach the target window procedure.

安裝一個(gè)HOOK,SetWindowsHookEx
對(duì)每種類(lèi)型的鉤子由系統(tǒng)來(lái)維護(hù)一個(gè)鉤子鏈,最近安裝的鉤子放在鏈的開(kāi)始,而最先安裝的鉤子放在最后,也就是后加入的先獲得控制權(quán)。
The SetWindowsHookEx function installs an application-defined hook procedure into a hook chain. You would install a hook procedure to monitor the system for certain types of events. These events are associated either with a specific thread or with all threads in the same desktop as the calling thread.
HHOOK SetWindowsHookEx(
  int idHook,        // hook type.請(qǐng)查看MSDN獲得詳細(xì)信息
  HOOKPROC lpfn,     // hook procedure
  HINSTANCE hMod,    // handle to application instance
  DWORD dwThreadId   // thread identifier
);

得到控制權(quán)的鉤子函數(shù)在完成對(duì)消息的處理后,如果想要該消息繼續(xù)傳遞,那么它必須調(diào)用另外一個(gè)SDK中的API函數(shù)CallNextHookEx來(lái)傳遞它。
CallNextHookEx
The CallNextHookEx function passes the hook information to the next hook procedure in the current hook chain. A hook procedure can call this function either before or after processing the hook information.
LRESULT CallNextHookEx(
  HHOOK hhk,      // handle to current hook
  int nCode,      // hook code passed to hook procedure
  WPARAM wParam,  // value passed to hook procedure
  LPARAM lParam   // value passed to hook procedure
);

hook處理函數(shù)
LRESULT CALLBACK HookProc(
  int nCode,
  WPARAM wParam,
  LPARAM lParam
);

取消HOOK
UnhookWindowsHookEx
The UnhookWindowsHookEx function removes a hook procedure installed in a hook chain by the SetWindowsHookEx function.
BOOL UnhookWindowsHookEx(
  HHOOK hhk   // handle to hook procedure
);

 

示例:
[code]
// 監(jiān)視鼠標(biāo)消息
// hook處理函數(shù)聲明
LRESULT CALLBACK MyMouseProc(int nCode, WPARAM wParam, LPARAM lParam);
static BOOL StartWatchingMouse(); // 開(kāi)始監(jiān)視
static void StopWatchingMouse();   // 結(jié)束
static HHOOK hHook = NULL;   //hook指針
/*======================================================
*Function:StartWatchingMouse()
*Author:wuhuiran 05-7-23
*Desc:開(kāi)始監(jiān)視鼠標(biāo)
*Record:
--------------------------------------------------------
========================================================*/
BOOL StartWatchingMouse()
{
 hHook = SetWindowHookEx(WM_MOUSE, (HOOKPROC) MyMouseProc,
  (HINSTANCE) NULL, GetCurrentThreadId());
  
 if(!hHook)
 {
  return FALSE;
 }
 
 return TRUE;
 
}

/*======================================================
*Function:StartWatchingMouse()
*Author:wuhuiran 05-7-23
*Desc:取消監(jiān)視鼠標(biāo)
*Record:
--------------------------------------------------------
========================================================*/
void StopWatchingMouse()
{
 if(hHook)
 {
  UnHookWindowHookEx(hHook);
  hHook = NULL;
 }
}

/*======================================================
*Function:StartWatchingMouse()
*Author:wuhuiran 05-7-23
*Desc:HOOK處理函數(shù)
*Record:
--------------------------------------------------------
========================================================*/
LRESULT CALLBACK MyMouseProc(int nCode, WPARAM wParam, LPARAM lParam)
{
 if(nCode < 0)
 {
  return CallNextHookEx(hHook, nCode, wParam, lParam);
  
 }
 
 MOUSEHOOKSTRUCT *pMouseHookStruct;  //鼠標(biāo)HOOK結(jié)構(gòu)體
 pMouseHookStruct = (MOUSEHOOKSTRUCT *)lParam;
 
 POINT pt = pMouseHookStruct->pt;
 //動(dòng)一下鼠標(biāo)就會(huì)顯示鼠標(biāo)位置
 CString strMsg;
 strMsg.Format("x:\t%d\ny:\t%d", pt.x, pt.y);
 AfxMessageBox(strMsg);
 
 return CallNextHookEx(myHook, nCode, wParam, lParam);
}
[/code]

注意:
hook會(huì)使系統(tǒng)變慢,除非必要,不要頻繁使用。在不使用的時(shí)候盡快刪除
全局鉤子必須放在DLL中

只是簡(jiǎn)單介紹了一下鉤子函數(shù)的使用方法,具體的函數(shù)介紹請(qǐng)參閱MSDN和其他文章。 



Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=885915

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類(lèi)似文章 更多