Hook
	
һ

    (Hook)WindowsϢƵһƽ̨,ӦóӳԼָڵĳϢӵĴڿġϢĿ괰ڴ֮ǰӻӦóػwindowϢض¼

    ʵһϢĳΣͨϵͳãϵͳÿضϢûеĿĴǰӳȲϢ༴ӺȵõȨʱӺԼӹı䣩ϢҲԲݸϢǿƽϢĴݡ

лƣ

1͹ӳ̣

    ÿһHookһָ֮б֮ΪϵͳάбָָָģӦóģHookӳ̵õĻصҲǸùӵĸӳָ̡Hook͹ϢʱϵͳͰϢݵHookӳ̡һЩHookӳֻ̿Ϣ޸ϢֹͣϢǰЩϢݵһHookӳ̻ĿĴڡװĹӷĿʼ簲װĹӷҲǺȻÿȨ

	Windows Ҫӳ̵ж˳һúͰװ˳෴ÿһӱжأWindows ͷռõڴ棬Hookװ˹ӣδжع֮ǰͽˣôϵͳԶΪжعӵĲ

    ӳһӦóĻص(CALLBACK Function),ܶĳĳԱֻܶΪͨCԼϵͳĳһض͵¼Щ¼ĳһض̹߳ģҲϵͳ̵߳¼

    ӳ̱밴µ﷨
    LRESULT CALLBACK HookProc
	(
	int nCode, 
     	WPARAM wParam, 
     	LPARAM lParam
     );
HookProcӦó֡

nCodeHook룬HookӳʹȷֵHookͣÿһHookԼHookַ
wParamlParamֵHook룬ǵĵֵǰ˹ڷͻ߽ϢϢ

2ӵİװͷţ

    ʹAPISetWindowsHookEx()һӦóĹӳ̰װСSetWindowsHookExHookĿͷװHookӳָ̡͵Hookӵ¼ʱϵͳ͵HookHookĿͷHookӳ̡ÿһHookеHookӳ̶Ƿ¼ݵһHookӳ̡Hookӳ̴¼һHookӳҪCallNextHookEx
    
HHOOK SetWindowsHookEx( 
int idHook,      // ӵͣϢ
HOOKPROC lpfn,   // ӳ̵ĵַָ롣dwThreadIdΪ0
			   // һɱĽ̴̵߳ıʶ
			   // lpfnָDLLеĹӳ̡
			   // ⣬lpfnָǰ̵һιӳ̴롣
			   // ӺڵַӹκϢ
HINSTANCE hMod,  // Ӧóʵľʶlpfnָӳ̵DLL
			   // dwThreadId ʶǰ̴һ̣߳
			   // ӳ̴λڵǰ̣hModΪNULL
			   // Ժܼ򵥵趨ΪӦóʵ
DWORD dwThreadId // 밲װĹӳ̵߳ıʶ
			   // Ϊ0ӳе̹߳Ϊȫֹӡ
            ); 
ɹ򷵻عӳ̵ľʧܷNULL

˵Ĺӳָ߳һз̵߳Ϣͬʱ͸ӳ̣ұӳȴ

    ڹӳеõõȨĹӺɶϢĴҪϢݣôһSDKеAPICallNextHookExִйָһӳ̡ɹʱعһӹ̵ķֵֵڹӵ͡ԭ£

LRESULT CallNextHookEx
			(
				HHOOK hhk;
				int nCode;
				WPARAM wParam;
				LPARAM lParam;
			 );
			
hhkΪǰӵľSetWindowsHookEx()ء
NCodeΪӹ̵¼롣
wParamlParam ֱǴӳ̵wParamֵ庬빳йء
		
    ӺҲֱͨӷTRUEϢֹϢĴݡĻװ˹ӵӦó򽫲յӵ֪ͨһпܲȷĽ

    ʹ֮ҪUnHookWindowsHookEx()жأ鷳ͷŹӱȽϼ򵥣UnHookWindowsHookEx()ֻһԭ£

UnHookWindowsHookEx
		(
		HHOOK hhk;
		);
ɹTRUE򷵻FALSE

3һЩлƣ

    Win16УDLLȫݶÿĽ˵ͬģWin32Уȴ˱仯DLLеĴκζ󣨰̻߳СDLLʱϵͳԶDLLַӳ䵽ý̵˽пռ䣬Ҳǽ̵ַռ䣬ҲƸDLLȫݵһݿý̿ռ䡣Ҳ˵ÿӵеͬDLLȫݣǵֵͬȴһͬģǻġ
	
	ˣWin32ҪڶйݣͱбҪáڷͬһDllĸ֮乲洢ͨ洢ӳļʵֵġҲ԰ЩҪݷһݶѸöεΪЩֵûиʼֵıһδʼݶС

	#pragma data_segԤָùݶΡ磺
#pragma data_seg("SharedDataName")
HHOOK hHook=NULL;
#pragma data_seg()
	#pragma data_seg("SharedDataName")#pragma data_seg()֮б ʸDllн̿͹

    ʽʽһ̬ĺʱϵͳҪ̬ӳ䵽̵ַռ(¼"ַռ")ʹDLLΪ̵һ̵ִ֣Уʹ̵Ķջ

4ϵͳ̹߳ӣ

    SetWindowsHookEx()һ˴˹ϵͳӻ̹߳ӡ
    
    ̹߳ڼ̵ָ߳¼Ϣ̹߳һڵǰ̻߳ߵǰ߳߳ڡ
    
    ϵͳӼϵͳе̵߳¼ϢΪϵͳӻӰϵͳеӦóԹӺڶĶ̬ӿ(DLL) СϵͳԶ"ӻص"DLLӳ䵽ܹӺӰн̵ĵַռУDLLעЩ̡

˵
 1ͬһ¼ϢȰװְ̹߳װϵͳӣôϵͳԶȵ̹߳ӣȻϵͳӡ 

 2ͬһ¼ϢɰװӴ̣ЩӴγ˹ǰӴӦѹϢݸһӺ 

 3رϵͳӻϢʱ䣬ϵͳܡֻڱҪʱŰװӣʹϺҪʱжء



    ÿһ͵HookʹӦóܹӲͬ͵ϵͳϢơпõHook͡

1WH_CALLWNDPROCWH_CALLWNDPROCRET Hooks

    WH_CALLWNDPROCWH_CALLWNDPROCRET HooksʹԼӷ͵ڹ̵ϢϵͳϢ͵մڹ֮ǰWH_CALLWNDPROC Hookӳ̣ڴڹ̴Ϣ֮WH_CALLWNDPROCRET Hookӳ̡

    WH_CALLWNDPROCRET Hookָ뵽CWPRETSTRUCTṹٴݵHookӳ̡CWPRETSTRUCTṹԴϢĴڹ̵ķֵͬҲϢϢ

2WH_CBT Hook

    ¼֮ǰϵͳWH_CBT Hookӳ̣Щ¼
    1. ٣С󻯣ƶıߴȴ¼
    2. ϵͳָ
    3. ϵͳϢеƶ꣬¼
    4. 뽹¼
    5. ͬϵͳϢ¼
    
    Hookӳ̵ķֵȷϵͳǷ߷ֹЩеһ

3WH_DEBUG Hook

    ϵͳϵͳHookHookӳ֮ǰϵͳWH_DEBUG Hookӳ̡ʹHookǷϵͳHookHookӳ̡

4WH_FOREGROUNDIDLE Hook

    Ӧóǰ̴̨߳ڿ״̬ʱʹWH_FOREGROUNDIDLE Hookִеȼ񡣵Ӧóǰ̴̨߳Ҫɿ״̬ʱϵͳͻWH_FOREGROUNDIDLE Hookӳ̡

5WH_GETMESSAGE Hook

    ӦóʹWH_GETMESSAGE HookӴGetMessage or PeekMessageصϢʹWH_GETMESSAGE Hookȥͼ룬Լ͵ϢеϢ

6WH_JOURNALPLAYBACK Hook

    WH_JOURNALPLAYBACK HookʹӦóԲϢϵͳϢСʹHookطͨʹWH_JOURNALRECORD Hook¼ͼ¼ֻҪWH_JOURNALPLAYBACK HookѾװͼ¼ЧġWH_JOURNALPLAYBACK HookȫHook߳ضHookһʹáWH_JOURNALPLAYBACK HookسʱֵֵϵͳڴԻطHookǰϢ֮ǰҪȴ೤ʱ䣨룩ʹHookԿʵʱ¼ĻطšWH_JOURNALPLAYBACKsystem-wide local hooksע䵽κгλַg

7WH_JOURNALRECORD Hook

    WH_JOURNALRECORD HookӺͼ¼¼͵ģʹHook¼ͼ¼ȻͨʹWH_JOURNALPLAYBACK HookطšWH_JOURNALRECORD HookȫHook߳ضHookһʹáWH_JOURNALRECORDsystem-wide local hooksע䵽κгλַg

8WH_KEYBOARD Hook

    ӦóУWH_KEYBOARD HookWM_KEYDOWN and WM_KEYUPϢЩϢͨGetMessage or PeekMessage functionءʹHook뵽ϢеļϢ

9WH_KEYBOARD_LL Hook

    WH_KEYBOARD_LL Hook뵽߳ϢеļϢ

10WH_MOUSE Hook

    WH_MOUSE HookӴGetMessage  PeekMessage صϢʹHook뵽ϢеϢ

11WH_MOUSE_LL Hook

    WH_MOUSE_LL Hook뵽߳ϢеϢ

12WH_MSGFILTER  WH_SYSMSGFILTER Hooks

    WH_MSGFILTER  WH_SYSMSGFILTER HooksʹǿԼӲ˵Ϣ򣬶ԻϢҷûʹALT+TAB or ALT+ESC ϼлڡWH_MSGFILTER HookֻܼӴݵ˵ϢϢԼݵͨװHookӳ̵ӦóĶԻϢWH_SYSMSGFILTER HookӦóϢ
    
    WH_MSGFILTER  WH_SYSMSGFILTER HooksʹǿģʽѭڼϢȼϢѭйϢ
    
ͨCallMsgFilter functionֱӵĵWH_MSGFILTER HookͨʹӦóܹģʽѭڼʹͬĴȥϢͬϢѭһ

13WH_SHELL Hook

    ӦóʹWH_SHELL HookȥҪ֪ͨӦóǼĲҵ㴰ڽʱϵͳWH_SHELL Hookӳ̡
 	WH_SHELL Уr
1. ֻҪиtop-levelunowned ڱáǱݻ٣
2. TaskbarҪػĳť
3. ϵͳҪʾTaskbarһСʽ
4. Ŀǰļ̲״̬ı䣻
5. ʹ߰Ctrl+EscȥִTask Managerͬĳ򣩡

    չӦó򶼲WH_SHELLϢԣӦóܹWH_SHELLϢ֮ǰӦóSystemParametersInfo functionעԼ
  


