ÀÌ ¹®¼¿¡¼´Â ¸¶¿ì½º ÈÄÅ©¸¦ ¿¹Á¦·Î »ç¿ëÇÏ¿© ½º·¹µå¿Í ÈÄÅ© ÇÁ·Î½ÃÀú¿¡ ƯÁ¤ÇÑ ÈÄÅ©¸¦ ¼³Á¤ÇÏ´Â ¹æ¹ýÀ»
¼³¸íÇÕ´Ï´Ù. ÈÄÅ©¸¦ »ç¿ëÇÏ¿© ƯÁ¤ Á¾·ùÀÇ À̺¥Æ®¸¦ ¸ð´ÏÅ͸µÇÒ ¼ö ÀÖ½À´Ï´Ù. ÀÌ·¯ÇÑ À̺¥Æ®¸¦ È£Ãâ ½º·¹µå ¿ªÇÒÀ» ÇÏ´Â °°Àº µ¥½ºÅ©Åé¿¡ ÀÖ´Â ¸ðµç
½º·¹µå ¶Ç´Â ƯÁ¤ ½º·¹µå¿Í ¿¬°áÇÒ ¼ö ÀÖ½À´Ï´Ù.
¸¶¿ì½º ÈÄÅ© ¼³Á¤
ÈÄÅ©¸¦ ¼³Á¤ÇÏ·Á¸é User32.dll ÆÄÀÏ¿¡¼
SetWindowsHookEx ÇÔ¼ö¸¦ È£ÃâÇÕ´Ï´Ù. ÀÌ ÇÔ¼ö´Â ÈÄÅ©¿Í ¿¬°áµÈ ÈÄÅ© üÀο¡ ÀÀ¿ë ÇÁ·Î±×·¥ Á¤ÀÇ ÈÄÅ© ÇÁ·Î½ÃÀú¸¦
¼³Ä¡ÇÕ´Ï´Ù.
¸¶¿ì½º ÈÄÅ©¸¦ ¼³Á¤ÇÏ°í ¸¶¿ì½º À̺¥Æ®¸¦ ¸ð´ÏÅ͸µÇÏ·Á¸é ´ÙÀ½°ú °°ÀÌ ÇϽʽÿÀ.
- Microsoft Visual Studio .NETÀ» ½ÃÀÛÇÕ´Ï´Ù.
- ÆÄÀÏ ¸Þ´º¿¡¼ »õ·Î ¸¸µé±â¸¦ °¡¸®Å² ´ÙÀ½ ÇÁ·ÎÁ§Æ®¸¦ ´©¸¨´Ï´Ù.
- »õ ÇÁ·ÎÁ§Æ® ´ëÈ »óÀÚÀÇ ÇÁ·ÎÁ§Æ® Çü½Ä¿¡¼ Visual C# ÇÁ·ÎÁ§Æ®¸¦ ´©¸¥ ´ÙÀ½ ÅÛÇø´¿¡¼ Windows ÀÀ¿ë ÇÁ·Î±×·¥À» ´©¸¨´Ï´Ù. À̸§ ÀԷ¶õ¿¡ ThreadSpecificMouseHook¸¦ ÀÔ·ÂÇÕ´Ï´Ù. ±âº»ÀûÀ¸·Î
Form1ÀÌ ÇÁ·ÎÁ§Æ®¿¡ Ãß°¡µË´Ï´Ù.
- Form1.cs ÆÄÀÏ¿¡¼ ´Ù¸¥ using ¹® ´ÙÀ½¿¡ ´ÙÀ½ ÄÚµå ÁÙÀ» Ãß°¡ÇÕ´Ï´Ù.
using System.Runtime.InteropServices;
- Form1 Ŭ·¡½º¿¡ ´ÙÀ½ Äڵ带 Ãß°¡ÇÕ´Ï´Ù.
public delegate int HookProc(int nCode, IntPtr wParam, IntPtr lParam);
//Declare hook handle as int.
static int hHook = 0;
//Declare mouse hook constant.
//For other hook types, you can obtain these values from Winuser.h in Microsoft SDK.
public const int WH_MOUSE = 7;
private System.Windows.Forms.Button button1;
//Declare MouseHookProcedure as HookProc type.
HookProc MouseHookProcedure;
//Declare wrapper managed POINT class.
[StructLayout(LayoutKind.Sequential)]
public class POINT
{
public int x;
public int y;
}
//Declare wrapper managed MouseHookStruct class.
[StructLayout(LayoutKind.Sequential)]
public class MouseHookStruct
{
public POINT pt;
public int hwnd;
public int wHitTestCode;
public int dwExtraInfo;
}
//Import for SetWindowsHookEx function.
//Use this function to install thread-specific hook.
[DllImport("user32.dll",CharSet=CharSet.Auto,
CallingConvention=CallingConvention.StdCall)]
public static extern int SetWindowsHookEx(int idHook, HookProc lpfn,
IntPtr hInstance, int threadId);
//Import for UnhookWindowsHookEx.
//Call this function to uninstall the hook.
[DllImport("user32.dll",CharSet=CharSet.Auto,
CallingConvention=CallingConvention.StdCall)]
public static extern bool UnhookWindowsHookEx(int idHook);
//Import for CallNextHookEx.
//Use this function to pass the hook information to next hook procedure in chain.
[DllImport("user32.dll",CharSet=CharSet.Auto,
CallingConvention=CallingConvention.StdCall)]
public static extern int CallNextHookEx(int idHook, int nCode,
IntPtr wParam, IntPtr lParam);
- Æû¿¡ Button ÄÁÆ®·ÑÀ» Ãß°¡ÇÑ ´ÙÀ½ Button1_click ÇÁ·Î½ÃÀú¿¡ ´ÙÀ½ Äڵ带 Ãß°¡ÇÕ´Ï´Ù.
private void button1_Click(object sender, System.EventArgs e)
{
if(hHook == 0)
{
// Create an instance of HookProc.
MouseHookProcedure = new HookProc(Form1.MouseHookProc);
hHook = SetWindowsHookEx(WH_MOUSE,
MouseHookProcedure,
(IntPtr)0,
AppDomain.GetCurrentThreadId());
//If SetWindowsHookEx fails.
if(hHook == 0 )
{
MessageBox.Show("SetWindowsHookEx Failed");
return;
}
button1.Text = "UnHook Windows Hook";
}
else
{
bool ret = UnhookWindowsHookEx(hHook);
//If UnhookWindowsHookEx fails.
if(ret == false )
{
MessageBox.Show("UnhookWindowsHookEx Failed");
return;
}
hHook = 0;
button1.Text = "Set Windows Hook";
this.Text = "Mouse Hook";
}
}
- Form1 Ŭ·¡½º¿¡¼ ´ÙÀ½ MouseHookProc ÇÔ¼ö Äڵ带 Ãß°¡ÇÕ´Ï´Ù.
public static int MouseHookProc(int nCode, IntPtr wParam, IntPtr lParam)
{
//Marshall the data from callback.
MouseHookStruct MyMouseHookStruct = (MouseHookStruct) Marshal.PtrToStructure(lParam, typeof(MouseHookStruct));
if (nCode < 0)
{
return CallNextHookEx(hHook, nCode, wParam, lParam);
}
else
{
//Create a string variable with shows current mouse. coordinates
String strCaption = "x = " +
MyMouseHookStruct.pt.x.ToString("d") +
" y = " +
MyMouseHookStruct.pt.y.ToString("d");
//Need to get the active form because it is a static function.
Form tempForm = Form.ActiveForm;
//Set the caption of the form.
tempForm.Text = strCaption;
return CallNextHookEx(hHook, nCode, wParam, lParam);
}
}
- F5 ۸¦ ´·¯¼ ÇÁ·ÎÁ§Æ®¸¦ ½ÇÇàÇÑ ´ÙÀ½ Æû¿¡¼ ´ÜÃ߸¦ ´·¯¼ ÈÄÅ©¸¦ ¼³Á¤ÇÕ´Ï´Ù. ¸¶¿ì½º Æ÷ÀÎÅͰ¡ Æû¿¡¼
À̵¿ÇÒ ¶§ ¸¶¿ì½º ÁÂÇ¥°¡ Æû ĸ¼Ç Ç¥½ÃÁÙ¿¡ ³ªÅ¸³³´Ï´Ù. ´ÜÃ߸¦ ´Ù½Ã ´·¯¼ ÈÄÅ©¸¦ Á¦°ÅÇÕ´Ï´Ù.
±Û·Î¹ú ÈÄÅ©°¡ .NET Framework¿¡¼ Áö¿øµÇÁö ¾ÊÀ½
Microsoft .NET Framework¿¡¼´Â ±Û·Î¹ú ÈÄÅ©¸¦ ±¸ÇöÇÒ ¼ö ¾ø½À´Ï´Ù. ±Û·Î¹ú ÈÄÅ©¸¦ ¼³Ä¡ÇÏ·Á¸é Àϰü¼º
ÀÖ°í À¯È¿ÇÑ ÇÔ¼ö¸¦ È£ÃâÇØ¾ß ÇÏ´Â ´Ù¸¥ ÇÁ·Î¼¼½º¿¡ DLL ÀÚü¸¦ »ðÀÔÇÏ´Â ±âº» µ¿Àû ¿¬°á ¶óÀ̺귯¸®(DLL) ³»º¸³»±â°¡ ÈÄÅ©¿¡ ÀÖ¾î¾ß ÇÕ´Ï´Ù.
ÀÌ·¯ÇÑ DLL ³»º¸³»±â´Â .NET Framework¿¡¼ Áö¿øµÇÁö ¾Ê½À´Ï´Ù. ÀÌ·¯ÇÑ ÇÔ¼ö Æ÷ÀÎÅÍ´Â µ¿ÀûÀ¸·Î ¸¸µé¾îÁö´Â ÇÁ·Ï½ÃÀ̱⠶§¹®¿¡ °ü¸®µÇ´Â
Äڵ忡´Â ÇÔ¼ö Æ÷ÀÎÅÍ¿¡ ´ëÇØ Àϰü¼º ÀÖ´Â °ªÀ̶ó´Â °³³äÀÌ ¾ø½À´Ï´Ù.
Windows ÈÄÅ©¿¡ ´ëÇÑ ÀÚ¼¼ÇÑ ³»¿ëÀº ´ÙÀ½ MSDN ¹®¼¸¦ ÂüÁ¶ÇϽʽÿÀ.
Microsoft Á¦Ç° °ü·Ã ±â¼ú Àü¹®°¡µé°ú ¿Â¶óÀÎÀ¸·Î Á¤º¸¸¦ ±³È¯ÇϽ÷Á¸é Microsoft ´º½º ±×·ì
(http://support.microsoft.com/newsgroups/default.aspx)
¿¡ Âü¿©ÇϽñ⠹ٶø´Ï´Ù.±â¼ú ÀÚ·á: 318804 - ¸¶Áö¸· °ËÅä: 2003³â 11¿ù 6ÀÏ ¸ñ¿äÀÏ - ¼öÁ¤: 2.0
º» ¹®¼ÀÇ Á¤º¸´Â ´ÙÀ½ÀÇ Á¦Ç°¿¡ Àû¿ëµË´Ï´Ù.
- Microsoft .NET Framework Software Development Kit 1.0 Service Pack 2
- Microsoft Visual C# .NET 2002 Standard Edition
| kbhowto kbhowtomaster KB318804 |