후킹? 포킹?? 와킹???

using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
namespace MsdnMag
{
    public class HookEventArgs : EventArgs
    {
        public int HookCode;    // Hook code
        public IntPtr wParam;   // WPARAM argument
        public IntPtr lParam;   // LPARAM argument
    }
    // Hook Types  
    public enum HookType : int
    {
        WH_JOURNALRECORD = 0,
        // 메시지 큐에 들어오는 키보드와
        //마우스의 입력 메시지를 저장하는 프로시저를 설치하기 위한
        //것입니다.
        WH_JOURNALPLAYBACK = 1,
        // WH_JOURNALRECORD를 통해서 기록된 내용을 재생한다.
        WH_KEYBOARD = 2,
        // 키보드 입력 내용을 모니터링한다.
        WH_GETMESSAGE = 3,
        //PostMessage를 통해서 메시지가 메시지 큐에 들어가는 것을 모니터링 한다.
        WH_CALLWNDPROC = 4,
        // SendMessage 프로시저가 처리되기 직전 시점을 모니터링 한다.
        WH_CBT = 5,
        // 원도우 생성/ 소멸 / 활성화등의 CBT 기반 프로그램에 도움이 될만한 
        // 정보를 통지 받을 수 있다.
        WH_SYSMSGFILTER = 6,
        // 다이얼로그 박스, 메뉴, 스크롤 바 등에서 생성되는 입력메시지를 모니터링 
        // 한다. 호출한 쓰레드와 같은 데스크탑 상에 존재하는 모든 원도우의 메시지를
        // 메시지를 감시한다.
        WH_MOUSE = 7,
        // 마우스 입력 내용을 모니터링 한다.
        WH_HARDWARE = 8,
        // 
        WH_DEBUG = 9,
        // 다른 훅 프로시저를 디버깅 하는 훅 프로시저
        WH_SHELL = 10,
        // 쉘 애플리케이션에 유용한 정보를 통지 받는다.
        WH_FOREGROUNDIDLE = 11,
        // 현재 활설화된 원도우 쓰레드가 유휴 상태가 될 때를 감지한다.
        WH_CALLWNDPROCRET = 12,        
        // SendMessage가 처리되고 리턴되는 시점을 모니터링 한다
        WH_KEYBOARD_LL = 13,
        // NT/ 2000/ XP: WH_MOUSE 보다 저 수준에서 키보드 입력 내용을 모니터링 
        // 한다.
        WH_MOUSE_LL = 14
        // NT/ 2000/ XP: WH_MOUSE 보다 저 수준에서 마우스 입력 내용을 모니터링 
        // 한다.
    }
    public class LocalWindowsHook
    {
        // **********************************************************************
        // dllimport = DLL에서(로) 함수, 데이터, 개체를 내보내는(가져오는) 속성
        // Win32: SetWindowsHookEx()
        [DllImport("user32.dll")]
        protected static extern IntPtr SetWindowsHookEx(HookType code,
            HookProc func,
            IntPtr hInstance,
            int threadID);
        // protected 
        // 포함하는 클래스 또는 여기에서 파생된 형식으로 액세스가 제한됩니다.
        // ==> protected로 선언된 클래스를 상속받은 클래스에서만 사용 가능하다.
        //extrn 
        // 내부와의 동작보다는 어떤 외부와의 관계를 정의하기위해 사용되어지고 있다
        // C#에서 extern 키워드는 외부 메소드를 사용할수 있도록 가리킨다.
        // user32.dll 
        // 파일의 경우 대부분 사용자 입력을 받는 역할을한다.
        // **********************************************************************
        // **********************************************************************
        // Win32: UnhookWindowsHookEx()
        [DllImport("user32.dll")]
        protected static extern int UnhookWindowsHookEx(IntPtr hhook);
        // **********************************************************************
        // **********************************************************************
        // Win32: CallNextHookEx()
        [DllImport("user32.dll")]
        protected static extern int CallNextHookEx(IntPtr hhook,
            int code, IntPtr wParam, IntPtr lParam);
        // **********************************************************************
        // ****************************************************************
        // Filter function delegate
        public delegate int HookProc(int code, IntPtr wParam, 
           IntPtr lParam);
        // delegate = 대리자
        // C/C++의 함수 포인터와 같다
        // ****************************************************************
        // ****************************************************************
        // Internal properties
        protected IntPtr m_hhook = IntPtr.Zero;
        protected HookProc m_filterFunc = null;
        protected HookType m_hookType;
        // ****************************************************************
        
        // ****************************************************************
        // Event delegate
        public delegate void HookEventHandler(object sender, 
           HookEventArgs e);
        // ****************************************************************
        // ****************************************************************
        // Event: HookInvoked 
        public event HookEventHandler HookInvoked;
        protected void OnHookInvoked(HookEventArgs e)
        {
            if (HookInvoked != null)
                HookInvoked(this, e);
        }
        // ****************************************************************
        // ****************************************************************
        // Class constructor(s)
        public LocalWindowsHook(HookType hook)
        {
            m_hookType = hook;
            m_filterFunc = new HookProc(this.CoreHookProc); 
        }
        public LocalWindowsHook(HookType hook, HookProc func)
        {
            m_hookType = hook;
            m_filterFunc = func; 
        }        
        // ****************************************************************
    
        // ****************************************************************
        // Default filter function
        public int CoreHookProc(int code, IntPtr wParam, IntPtr lParam)
        {
            if (code < 0)
                return CallNextHookEx(m_hhook, code, wParam, lParam);
            // Let clients determine what to do
            HookEventArgs e = new HookEventArgs();
            e.HookCode = code;
            e.wParam = wParam;
            e.lParam = lParam;
            OnHookInvoked(e);
            // Yield to the next hook in the chain
            return CallNextHookEx(m_hhook, code, wParam, lParam);
        }
        // ****************************************************************
        // ****************************************************************
        // Install the hook
        public void Install()
        {
            m_hhook = SetWindowsHookEx(
                m_hookType, 
                m_filterFunc, 
                IntPtr.Zero, 
                (int) AppDomain.GetCurrentThreadId());
        }
        // ****************************************************************
        // ****************************************************************
 
        // Uninstall the hook
        public void Uninstall()
        {
            UnhookWindowsHookEx(m_hhook); 
        }
        // ****************************************************************
        /-
        #region Win32 Imports
        : (see Figure 2)
        #endregion*-
    }
}

덧글

댓글 입력 영역