ÈŠüÀο¡ µî·ÏµÇ¾î ¸Þ½ÃÁö¸¦ °¨½ÃÇÏ´Â ÇÔ¼ö¸¦ ÈÅ ÇÁ·Î½ÃÀú(Hook Procedure)¶ó°í ÇÑ´Ù. ÈŠŸÀÔ¿¡ µû¶ó ÈÅ ÇÁ·Î½ÃÀúÀÇ Àμö³ª ¸®ÅϰªÀÇ Àǹ̴ ´Þ¶óÁöÁö¸¸ ¿øÇüÀº °íÁ¤µÇ¾î ÀÖ´Ù. ´ÙÀ½Àº WH_KEYBOARD ŸÀÔÀÇ Å°º¸µå ÈÅ ÇÁ·Î½ÃÀúÀε¥ ´Ù¸¥ ŸÀÔÀÇ ÈÅ ÇÁ·Î½ÃÀúµµ À̸§¸¸ ´Ù¸£°í ¿øÇüÀº µ¿ÀÏÇÏ´Ù.
LRESULT CALLBACK KeyboardProc( int code, WPARAM wParam, LPARAM lParam);
ÈÅ ÇÁ·Î½ÃÀú´Â ÀÀ¿ë ÇÁ·Î±×·¥ÀÌ Á¦°øÇÏ´Â Äݹé ÇÔ¼öÀ̹ǷΠ¿øÇü¸¸ Á¦´ë·Î ÁöŲ´Ù¸é À̸§Àº ¸¶À½´ë·Î Á¤ÇÒ ¼ö ÀÖ´Ù. ¼¼ °³ÀÇ Àμö¸¦ °¡Áö´Âµ¥ ù ¹øÂ° Àμö code´Â ÈÅ ÇÁ·Î½ÃÀú¿¡¼ ÀÌ ¸Þ½ÃÁö¸¦ ¾î¶»°Ô ó¸®ÇÒ °ÍÀΰ¡¸¦ ¾Ë·ÁÁÖ¸ç ÀÌ °ªÀÌ À½¼öÀ̸é ÈÅ ÇÁ·Î½ÃÀú´Â ÀÌ ¸Þ½ÃÁö¸¦ ó¸®ÇÏÁö ¸»°í ´ÙÀ½ ÈÅ ÇÁ·Î½ÃÀú¿¡°Ô ¸Þ½ÃÁö¸¦ ³Ñ°Ü¾ß ÇÑ´Ù. wParam, lParamÀº Àü´ÞµÈ ¸Þ½ÃÁö¿¡ ´ëÇÑ Ãß°¡ Á¤º¸µéÀε¥ ½ÇÁ¦ Àǹ̴ ÈŠŸÀÔ¿¡ µû¶ó ´Þ¶óÁö¹Ç·Î °¢ ŸÀÔº°·Î ·¹ÆÛ·±½º¸¦ Âü°íÇØ¾ß ÇÑ´Ù. ÈÅ ÇÁ·Î½ÃÀú¸¦ ¼³Ä¡ÇÒ ¶§´Â ´ÙÀ½ ÇÔ¼ö¸¦ »ç¿ëÇÑ´Ù.
HHOOK SetWindowsHookEx( int idHook, HOOKPROC lpfn, HINSTANCE hMod, DWORD dwThreadId );
ù ¹øÂ° Àμö idHookÀº ¼³Ä¡ÇϰíÀÚ ÇÏ´Â ÈÅÀÇ Å¸ÀÔÀ» ÁöÁ¤Çϸç WH_·Î ½ÃÀ۵Ǵ ¸ÅÅ©·Î »ó¼öÁß Çϳª¸¦ ½á ÁÖ¸é µÈ´Ù. lpfnÀº ÈÅ ÇÁ·Î½ÃÀúÀÇ ¹øÁöÀ̸ç hMod´Â ÈÅ ÇÁ·Î½ÃÀú¸¦ °¡Áø ÀνºÅϽº ÇÚµéÀÌ´Ù. dwThreadId´Â ÈÅ ÇÁ·Î½ÃÀú°¡ °¨½ÃÇÒ ½º·¹µåÀÇ IDÀÌµÇ ÀÌ °ªÀÌ 0ÀÌ¸é ½Ã½ºÅÛÀÇ ¸ðµç ½º·¹µå¿¡¼ ¹ß»ýÇÏ´Â ¸Þ½ÃÁö°¡ ÈÅ ÇÁ·Î½ÃÀú·Î Àü´ÞµÈ´Ù. ÀÚ½ÅÀÇ ¸Þ½ÃÁö¸¦ ÈÅÅ·ÇÒ ¶§´Â GetCurrentThreadId ÇÔ¼ö·Î ÇöÀç ½º·¹µåÀÇ ID¸¦ ³Ñ°ÜÁÖ¸é µÈ´Ù. ½Ã½ºÅÛÀÇ ¸ðµç ¸Þ½ÃÁö¸¦ °¨½ÃÇϰíÀÚ ÇѴٰųª ´Ù¸¥ ÇÁ·Î±×·¥ÀÇ ¸Þ½ÃÁö¸¦ °¨½ÃÇϰíÀÚ ÇÒ °æ¿ì lpfnÀº ¹Ýµå½Ã ºÐ¸®µÈ DLL¿¡ ÀÖ¾î¾ß Çϸç À̶§ hMod´Â ÀÌ DLLÀÇ ÇÚµéÀ̾î¾ß ÇÑ´Ù. ´ÙÀ½Àº Áö¿ª ÈŰú Àü¿ª ÈÅÀ» ¼³Ä¡ÇÏ´Â ÀϹÝÀûÀÎ ¹æ¹ýÀÌ´Ù.
Áö¿ª ÈÅ : SetWindowsHookEx(idHook, lpfn, NULL, GetCurrentThreadId());
Àü¿ª ÈÅ : SetWindowsHookEx(idHook, lpfn, hDll, 0);
SetWindowsHookEx ÇÔ¼ö´Â ÈÅ ÇÁ·Î½ÃÀú¸¦ ¼³Ä¡ÇÑ ÈÄ HHOOK ŸÀÔÀÇ ÈÅ ÇÚµéÀ» ¸®ÅÏÇØ Áִµ¥ ÀÌ ÇÚµéÀº ÇØÁ¦¸¦ À§ÇØ Àü¿ªº¯¼ö¿¡ Àß º¸°üÇØ µÎ¾î¾ß ÇÑ´Ù. ¸¸¾à ¿¡·¯°¡ ¹ß»ýÇß´Ù¸é NULLÀ» ¸®ÅÏÇÑ´Ù. ÈÅ ÇÁ·Î½ÃÀú¸¦ ÇØÁ¦ÇÏ´Â ÇÔ¼ö´Â ´ÙÀ½°ú °°´Ù.
BOOL UnhookWindowsHookEx( HHOOK hhk );
ÇØÁ¦ÇϰíÀÚ ÇÏ´Â ÈÅ ÇÚµéÀ» ³Ñ°ÜÁֱ⸸ ÇÏ¸é µÈ´Ù. ÈÅÀ» ¼³Ä¡ÇÑ ÇÁ·Î±×·¥Àº Á¾·áµÇ±â Àü¿¡ ¹Ýµå½Ã ÈÅ ÇÁ·Î½ÃÀú¸¦ ÇØÁ¦ÇØ ÁÖ¾î¾ß ÇÑ´Ù. ÈÅ ÇÁ·Î½ÃÀú°¡ ¼³Ä¡µÇ¸é ÇØ´ç ŸÀÔÀÇ ¸Þ½ÃÁö´Â ¸ñÇ¥ À©µµ¿ì·Î º¸³»Áö±â Àü¿¡ ÈÅ ÇÁ·Î½ÃÀú¿¡°Ô ¸ÕÀú Àü´ÞµÇ´Âµ¥ ÈÅ ÇÁ·Î½ÃÀú´Â ¸Þ½ÃÁö¸¦ »ìÆìº» ÈÄ Æ¯º°ÇÑ ÀÌÀ¯°¡ ¾øÀ¸¸é ¸Þ½ÃÁö¸¦ ÈŠüÀÎÀÇ ´ÙÀ½ ÈÅ ÇÁ·Î½ÃÀú¿¡°Ô Àü´ÞÇØ ÁÖ¾î¾ß ÇÑ´Ù. À̶§´Â ´ÙÀ½ ÇÔ¼ö¸¦ »ç¿ëÇÑ´Ù.
LRESULT CallNextHookEx( HHOOK hhk, int nCode, WPARAM wParam, LPARAM lParam );
hhk´Â ÇöÀç ó¸®Çϰí ÀÖ´Â ÈÅÀÇ ÇÚµéÀε¥ SetWindowsHookEx ÇÔ¼ö°¡ ¸®ÅÏÇÑ °ªÀÌ´Ù. ³ª¸ÓÁö ¼¼ Àμö´Â ¿î¿µÃ¼Á¦°¡ ÈÅ ÇÁ·Î½ÃÀú¿¡°Ô Àü´ÞÇØÁØ ÀμöµéÀÌ´Ù. ÈŠüÀο¡ Æ÷ÇÔµÈ ÈÅ ÇÁ·Î½ÃÀúÀÇ ¸ñ·ÏÀº ¿î¿µÃ¼Á¦°¡ Á÷Á¢ °ü¸®Çϱ⠶§¹®¿¡ ÈÅÀ» ¼³Ä¡ÇÑ ÀÀ¿ë ÇÁ·Î±×·¥Àº ´ÙÀ½ ÈÅ ÇÁ·Î½ÃÀúÀÇ ¹øÁö¸¦ µû·Î ÀúÀåÇÒ ÇÊ¿ä¾øÀÌ ÀÌ ÇÔ¼ö¸¸ È£ÃâÇØ ÁÖ¸é ÈŠüÀÎÀ» µû¶ó ¸ðµç ÈÅ ÇÁ·Î½ÃÀú°¡ ¼ø¼´ë·Î È£ÃâµÇ¸ç ÃÖÁ¾ÀûÀ¸·Î ¸ñÇ¥ À©µµ¿ì·Î ¸Þ½ÃÁö°¡ Àü´ÞµÉ °ÍÀÌ´Ù.
ÈÅ ÇÁ·Î½ÃÀú´Â Àü´Þ ¹ÞÀº ¸Þ½ÃÁö¸¦ ´ÙÀ½ ÈÅ ÇÁ·Î½ÃÀú¿¡°Ô ²À Àü´ÞÇØ ÁÖ¾î¾ß ÇÒ Àǹ«´Â ¾øÀ¸¸ç ¸Þ½ÃÁö¸¦ ¾Æ¿¹ ¾ø¾Ö¹ö¸®·Á¸é Àü´ÞÇÏÁö ¾Ê¾Æµµ »ó°ü¾øÀ¸¸ç ¿øÇÏ´Â ´ë·Î º¯°æÇÒ ¼öµµ ÀÖ´Ù. ¹°·Ð ÀÌ ¶§´Â ¸Þ½ÃÁö¸¦ ¾ø¾Ö¹ö¸®°Å³ª º¯°æÇÑ ÈÄÀÇ È¿°ú¿¡ ´ëÇØ È®½ÇÈ÷ Ã¥ÀÓÁú ¼ö ÀÖ¾î¾ß ÇÑ´Ù. ÀÌ ÇÔ¼ö´Â ÈŠüÀο¡¼ ´ÙÀ½ ÈÅ ÇÁ·Î½ÃÀú¸¦ È£ÃâÇϰí ÈÅ ÇÁ·Î½ÃÀú°¡ ¸®ÅÏÇÏ´Â °ªÀ» ´Ù½Ã ¸®ÅÏÇØ Áִµ¥ ÇöÀçÀÇ ÈÅ ÇÁ·Î½ÃÀú´Â ÀÌ ¸®ÅϰªÀ» ¶Ç ±×´ë·Î ¸®ÅÏÇØ ÁÖ¾î¾ß ÇÑ´Ù. ±×·¡¼ ÈÅ ÇÁ·Î½ÃÀúÀÇ ³¡Àº º¸Åë return CallNextHookEx(...) È£Ãâ¹®ÀÌ ¿Â´Ù.
´ÙÀ½Àº À©µµ¿ìÁî°¡ Á¦°øÇÏ´Â ÈŠŸÀÔµéÀÌ´Ù. ÈŠŸÀÔ¿¡ µû¶ó °¨½ÃÇϰí Ãë±ÞÇÒ ¼ö ÀÖ´Â ¸Þ½ÃÁöÀÇ Á¾·ù°¡ ´Þ¶óÁø´Ù.
ÈŠŸÀÔ |
¼³¸í |
WH_CALLWNDPROC, WH_CALLWNDPROCRET |
SendMessage ÇÔ¼ö·Î ¸Þ½ÃÁö¸¦ º¸³»±â Àü¿¡ WH_CALLWNDPROC ÈÅ ÇÁ·Î½ÃÀú°¡ È£ÃâµÇ¸ç À©µµ¿ì ÇÁ·Î½ÃÀú°¡ ¸Þ½ÃÁö¸¦ ó¸®ÇÑ ÈÄ¿¡ WH_CALLWNDPROCRET ÈÅ ÇÁ·Î½ÃÀú°¡ È£ÃâµÈ´Ù. WH_CALLWNDPROCRET ÈÅÀº ÈÅ ÇÁ·Î½ÃÀú¿¡°Ô CWPRETSTRUCT ±¸Á¶Ã¼¸¦ Àü´ÞÇϴµ¥ ÀÌ ±¸Á¶Ã¼¿¡´Â ¸Þ½ÃÁö¿Í ¸Þ½Ã½Ã¸¦ ó¸®ÇÑ ¸®ÅϰªÀ» ´ã°í ÀÖ´Ù. |
WH_CBT |
À©µµ¿ì¸¦ »ý¼º, ÆÄ±«, Ȱ¼ºÈ, ÃÖ´ë, ÃÖ¼Ò, À̵¿, Å©±âº¯°æÇϱâ Àü¿¡, ½Ã½ºÅÛ ¸í·ÉÀ» ó¸®Çϱâ Àü¿¡, ¸¶¿ì½º³ª Űº¸µå ¸Þ½ÃÁö¸¦ ¸Þ½ÃÁö Å¥¿¡¼ Á¦°ÅÇϱâ Àü¿¡ ÀÌ ÈÅ ÇÁ·Î½ÃÀú°¡ È£ÃâµÈ´Ù. ÀÌ ÈÅÀº ÄÄÇ»Å͸¦ ÀÌ¿ëÇÑ ÈÆ·Ã ÇÁ·Î±×·¥(Computer Based Training)¿¡¼ ÁÖ·Î »ç¿ëµÈ´Ù. |
WH_DEBUG |
´Ù¸¥ ŸÀÔÀÇ ÈÅ ÇÁ·Î½ÃÀú¸¦ È£ÃâÇϱâ Àü¿¡ ÀÌ Å¸ÀÔÀÇ ÈÅ ÇÁ·Î½ÃÀú¸¦ È£ÃâÇÏ¸ç ´Ù¸¥ ŸÀÔÀÇ ÈÅ ÇÁ·Î½ÃÀú È£ÃâÀ» Çã°¡ÇÒ °ÍÀÎÁö¸¦ °áÁ¤ÇÑ´Ù. |
WH_GETMESSAGE |
GetMessage³ª PeekMessage ÇÔ¼ö·Î Á¶»çµÇ´Â ¸Þ½ÃÁö¸¦ °¨½ÃÇÑ´Ù. |
WH_JOURNALRECORD |
Űº¸µå³ª ¸¶¿ì½º¸¦ ÅëÇØ ÀԷµǴ À̺¥Æ®¸¦ °¨½ÃÇÏ°í ±â·ÏÇÑ´Ù. ±â·ÏµÈ À̺¥Æ®´Â WH_JOURNALPLAYBACK ÈÅ¿¡¼ Àç»ýÇÒ ¼ö ÀÖ´Ù. ÀÌ ÈÅÀº Àü¿ªÀ¸·Î¸¸ ¼³Ä¡ÇÒ ¼ö ÀÖÀ¸¸ç ƯÁ¤ ½º·¹µå¿¡¸¸ ¼³Ä¡ÇÒ ¼ö´Â ¾ø´Ù. |
WH_JOURNALPLAYBACK |
½Ã½ºÅÛ ¸Þ½ÃÁö Å¥¿¡ ¸Þ½ÃÁö¸¦ »ðÀÔÇÒ ¼ö ÀÖµµ·Ï ÇÑ´Ù. ÀÌ ÈÅ¿¡¼ WH_JOURNALRECORD ÈÅ¿¡¼ ±â·ÏÇÑ Å°º¸µå ¸¶¿ì½º ÀÔ·ÂÀ» Àç»ýÇÒ ¼ö ÀÖ´Ù. ÀÌ ÈÅÀÌ ¼³Ä¡µÇ¾î ÀÖÀ¸¸é ¸¶¿ì½º³ª Űº¸µå ÀÔ·ÂÀº ±ÝÁöµÈ´Ù. ÀÌ ÈÅÀº Àü¿ªÀ¸·Î¸¸ ¼³Ä¡ÇÒ ¼ö ÀÖÀ¸¸ç ƯÁ¤ ½º·¹µå¿¡¸¸ ¼³Ä¡ÇÒ ¼ö´Â ¾ø´Ù. |
WH_KEYBOARD |
WM_KEYDOWN, WM_KEYUP µîÀÇ Å°º¸µå ¸Þ½ÃÁö¸¦ °¨½ÃÇÑ´Ù. |
WH_MOUSE |
¸¶¿ì½º ¸Þ½ÃÁö¸¦ °¨½ÃÇÑ´Ù. |
WH_MSGFILTER, WH_SYSMSGFILTER |
¸Þ´º, ½ºÅ©·Ñ ¹Ù, ¸Þ½ÃÁö ¹Ú½º, ´ëÈ»óÀÚ µî¿¡ ÀÇÇØ 󸮵Ǵ ¸Þ½ÃÁö¿Í »ç¿ëÀÚÀÇ Alt+TabŰ, Alt+EscŰ ÀԷ¿¡ ÀÇÇÑ Æ÷Ä¿½º À̵¿À» °¨½ÃÇÑ´Ù. WH_MSGFILTERÈÅÀº ÈÅ ÇÁ·Î½ÃÀú¸¦ ¼³Ä¡ÇÑ ÇÁ·Î±×·¥¿¡ ´ëÇØ¼¸¸ µ¿ÀÛÇϸç WH_SYSMSGFILTER ÈÅÀº ¸ðµç ÇÁ·Î±×·¥¿¡ ´ëÇØ¼ µ¿ÀÛÇÑ´Ù. |
WH_SHELL |
½© ÇÁ·Î±×·¥ÀÌ È°¼ºÈµÇ°Å³ª »õ·Î¿î ÃÖ»óÀ§ À©µµ¿ì°¡ ¸¸µé¾îÁö°Å³ª ÆÄ±«µÉ ¶§ ÀÌ ÈÅ ÇÁ·Î½ÃÀú°¡ È£ÃâµÈ´Ù. |
WH_FOREGROUNDIDLE |
Æ÷±×¶ó¿îµå ½º·¹µå°¡ ÇѰ¡ÇØÁú ¶§ ÀÌ ÈÅ ÇÁ·Î½ÃÀú°¡ È£ÃâµÈ´Ù. ¾ÆÀÌµé ½Ã¿¡ ¿ì¼± ¼øÀ§°¡ ³·Àº ÀÛ¾÷À» ÇÏ°í ½ÍÀ» ¶§ ÀÌ ÈÅÀ» »ç¿ëÇÑ´Ù. |
WH_KEYBOARD_LL |
½º·¹µåÀÇ ÀÔ·ÂÅ¥¿¡ ºÙ¿©Áö´Â Űº¸µå ÀÔ·Â ¸Þ½ÃÁö¸¦ °¨½ÃÇÑ´Ù. WH_KEYBOARDº¸´Ù ´õ Àú¼öÁØÀÇ ¸Þ½ÃÁö¸¦ ¹ÞÀ» ¼ö ÀÖÁö¸¸ NT 4.0 SP 3 ÀÌÈÄ¿¡¸¸ »ç¿ëÇÒ ¼ö ÀÖ´Ù. |
WH_MOUSE_LL |
½º·¹µåÀÇ ÀÔ·ÂÅ¥¿¡ ºÙ¿©Áö´Â ¸¶¿ì½º ÀÔ·Â ¸Þ½ÃÁö¸¦ °¨½ÃÇÑ´Ù. |
°¢ ÈŠŸÀÔ¿¡ µû¶ó »ç¿ëµÇ´Â ±¸Á¶Ã¼³ª ¸®Åϰª, ÈÅ ÇÁ·Î½ÃÀúÀÇ Àμö°¡ ´Ù¸£¹Ç·Î »ó¼¼ÇÑ Á¤º¸´Â ·¹ÆÛ·±½º¸¦ ÂüÁ¶Çϱ⠹ٶõ´Ù.