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

피드백 보내기

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com