HOW TO: Visual C# .NET¿¡¼­ Windows ÈÄÅ© ¼³Á¤

±â¼ú ÀÚ·á: 318804 - ÀÌ ¹®¼­°¡ Àû¿ëµÇ´Â Á¦Ç° º¸±â.
¸ðµÎ È®´ë | ¸ðµÎ Ãà¼Ò

ÀÌ ÆäÀÌÁö¿¡¼­

¿ä¾à

ÀÌ ¹®¼­¿¡¼­´Â ¸¶¿ì½º ÈÄÅ©¸¦ ¿¹Á¦·Î »ç¿ëÇÏ¿© ½º·¹µå¿Í ÈÄÅ© ÇÁ·Î½ÃÀú¿¡ ƯÁ¤ÇÑ ÈÄÅ©¸¦ ¼³Á¤ÇÏ´Â ¹æ¹ýÀ» ¼³¸íÇÕ´Ï´Ù. ÈÄÅ©¸¦ »ç¿ëÇÏ¿© ƯÁ¤ Á¾·ùÀÇ À̺¥Æ®¸¦ ¸ð´ÏÅ͸µÇÒ ¼ö ÀÖ½À´Ï´Ù. ÀÌ·¯ÇÑ À̺¥Æ®¸¦ È£Ãâ ½º·¹µå ¿ªÇÒÀ» ÇÏ´Â °°Àº µ¥½ºÅ©Åé¿¡ ÀÖ´Â ¸ðµç ½º·¹µå ¶Ç´Â ƯÁ¤ ½º·¹µå¿Í ¿¬°áÇÒ ¼ö ÀÖ½À´Ï´Ù.



¸¶¿ì½º ÈÄÅ© ¼³Á¤

ÈÄÅ©¸¦ ¼³Á¤ÇÏ·Á¸é User32.dll ÆÄÀÏ¿¡¼­ SetWindowsHookEx ÇÔ¼ö¸¦ È£ÃâÇÕ´Ï´Ù. ÀÌ ÇÔ¼ö´Â ÈÄÅ©¿Í ¿¬°áµÈ ÈÄÅ© üÀο¡ ÀÀ¿ë ÇÁ·Î±×·¥ Á¤ÀÇ ÈÄÅ© ÇÁ·Î½ÃÀú¸¦ ¼³Ä¡ÇÕ´Ï´Ù.

¸¶¿ì½º ÈÄÅ©¸¦ ¼³Á¤ÇÏ°í ¸¶¿ì½º À̺¥Æ®¸¦ ¸ð´ÏÅ͸µÇÏ·Á¸é ´ÙÀ½°ú °°ÀÌ ÇϽʽÿÀ.
  1. Microsoft Visual Studio .NETÀ» ½ÃÀÛÇÕ´Ï´Ù.
  2. ÆÄÀÏ ¸Þ´º¿¡¼­ »õ·Î ¸¸µé±â¸¦ °¡¸®Å² ´ÙÀ½ ÇÁ·ÎÁ§Æ®¸¦ ´©¸¨´Ï´Ù.
  3. »õ ÇÁ·ÎÁ§Æ® ´ëÈ­ »óÀÚÀÇ ÇÁ·ÎÁ§Æ® Çü½Ä¿¡¼­ Visual C# ÇÁ·ÎÁ§Æ®¸¦ ´©¸¥ ´ÙÀ½ ÅÛÇø´¿¡¼­ Windows ÀÀ¿ë ÇÁ·Î±×·¥À» ´©¸¨´Ï´Ù. À̸§ ÀԷ¶õ¿¡ ThreadSpecificMouseHook¸¦ ÀÔ·ÂÇÕ´Ï´Ù. ±âº»ÀûÀ¸·Î Form1ÀÌ ÇÁ·ÎÁ§Æ®¿¡ Ãß°¡µË´Ï´Ù.
  4. Form1.cs ÆÄÀÏ¿¡¼­ ´Ù¸¥ using ¹® ´ÙÀ½¿¡ ´ÙÀ½ ÄÚµå ÁÙÀ» Ãß°¡ÇÕ´Ï´Ù.
    using System.Runtime.InteropServices;
    					
  5. 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);  
    					
  6. Æû¿¡ 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";
    	} 
    }
    					
  7. 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); 
    	}
    }
    					
  8. F5 ۸¦ ´­·¯¼­ ÇÁ·ÎÁ§Æ®¸¦ ½ÇÇàÇÑ ´ÙÀ½ Æû¿¡¼­ ´ÜÃ߸¦ ´­·¯¼­ ÈÄÅ©¸¦ ¼³Á¤ÇÕ´Ï´Ù. ¸¶¿ì½º Æ÷ÀÎÅͰ¡ Æû¿¡¼­ À̵¿ÇÒ ¶§ ¸¶¿ì½º ÁÂÇ¥°¡ Æû ĸ¼Ç Ç¥½ÃÁÙ¿¡ ³ªÅ¸³³´Ï´Ù. ´ÜÃ߸¦ ´Ù½Ã ´­·¯¼­ ÈÄÅ©¸¦ Á¦°ÅÇÕ´Ï´Ù.

±Û·Î¹ú ÈÄÅ©°¡ .NET Framework¿¡¼­ Áö¿øµÇÁö ¾ÊÀ½

Microsoft .NET Framework¿¡¼­´Â ±Û·Î¹ú ÈÄÅ©¸¦ ±¸ÇöÇÒ ¼ö ¾ø½À´Ï´Ù. ±Û·Î¹ú ÈÄÅ©¸¦ ¼³Ä¡ÇÏ·Á¸é Àϰü¼º ÀÖ°í À¯È¿ÇÑ ÇÔ¼ö¸¦ È£ÃâÇØ¾ß ÇÏ´Â ´Ù¸¥ ÇÁ·Î¼¼½º¿¡ DLL ÀÚü¸¦ »ðÀÔÇÏ´Â ±âº» µ¿Àû ¿¬°á ¶óÀ̺귯¸®(DLL) ³»º¸³»±â°¡ ÈÄÅ©¿¡ ÀÖ¾î¾ß ÇÕ´Ï´Ù. ÀÌ·¯ÇÑ DLL ³»º¸³»±â´Â .NET Framework¿¡¼­ Áö¿øµÇÁö ¾Ê½À´Ï´Ù. ÀÌ·¯ÇÑ ÇÔ¼ö Æ÷ÀÎÅÍ´Â µ¿ÀûÀ¸·Î ¸¸µé¾îÁö´Â ÇÁ·Ï½ÃÀ̱⠶§¹®¿¡ °ü¸®µÇ´Â Äڵ忡´Â ÇÔ¼ö Æ÷ÀÎÅÍ¿¡ ´ëÇØ Àϰü¼º ÀÖ´Â °ªÀ̶ó´Â °³³äÀÌ ¾ø½À´Ï´Ù.

ÂüÁ¶

Windows ÈÄÅ©¿¡ ´ëÇÑ ÀÚ¼¼ÇÑ ³»¿ëÀº ´ÙÀ½ MSDN ¹®¼­¸¦ ÂüÁ¶ÇϽʽÿÀ.
ÈÄÅ© Á¤º¸
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/WinUI/WindowsUserInterface/Windowing/Hooks/AboutHooks.asp




Microsoft Á¦Ç° °ü·Ã ±â¼ú Àü¹®°¡µé°ú ¿Â¶óÀÎÀ¸·Î Á¤º¸¸¦ ±³È¯ÇϽ÷Á¸é Microsoft ´º½º ±×·ì¿¡ Âü¿©ÇϽñ⠹ٶø´Ï´Ù.

¼Ó¼º

±â¼ú ÀÚ·á: 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

Çǵå¹é º¸³»±â