³ª. ÈÅ ÇÁ·Î½ÃÀú

ÈŠüÀο¡ µî·ÏµÇ¾î ¸Þ½ÃÁö¸¦ °¨½ÃÇÏ´Â ÇÔ¼ö¸¦ ÈÅ ÇÁ·Î½ÃÀú(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

½º·¹µåÀÇ ÀÔ·ÂÅ¥¿¡ ºÙ¿©Áö´Â ¸¶¿ì½º ÀÔ·Â ¸Þ½ÃÁö¸¦ °¨½ÃÇÑ´Ù.

 

°¢ ÈŠŸÀÔ¿¡ µû¶ó »ç¿ëµÇ´Â ±¸Á¶Ã¼³ª ¸®ÅÏ°ª, ÈÅ ÇÁ·Î½ÃÀúÀÇ Àμö°¡ ´Ù¸£¹Ç·Î »ó¼¼ÇÑ Á¤º¸´Â ·¹ÆÛ·±½º¸¦ ÂüÁ¶Çϱ⠹ٶõ´Ù.