C# hook的一个简单例子

效果是:你输入“b”,它肯定还是“a”。。。-_-!!!

public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        internal enum HookType //枚举,钩子的类型
        {
            //MsgFilter = -1,
            //JournalRecord = 0,
            //JournalPlayback = 1,
            Keyboard = 2,
            //GetMessage = 3,
            //CallWndProc = 4,
            //CBT = 5,
            //SysMsgFilter = 6,

            //Mouse = 7,
            //Hardware = 8,
            //Debug = 9,
            //Shell = 10,
            //ForegroundIdle = 11,
            //CallWndProcRet = 12,
            //KeyboardLL = 13,
            //MouseLL = 14,
        };

        IntPtr _nextHookPtr; //记录Hook编号

        [DllImport("kernel32.dll")]
        static extern int GetCurrentThreadId(); //取得当前线程编号的API

        [DllImport("User32.dll")]
        internal extern static void UnhookWindowsHookEx(IntPtr handle); //取消Hook的API

        [DllImport("User32.dll")]
        internal extern static IntPtr SetWindowsHookEx(int idHook, [MarshalAs(UnmanagedType.FunctionPtr)] HookProc lpfn, IntPtr hinstance, int threadID); //设置Hook的API

        [DllImport("User32.dll")]
        internal extern static IntPtr CallNextHookEx(IntPtr handle, int code, IntPtr wparam, IntPtr lparam); //取得下一个Hook的API

        internal delegate IntPtr HookProc(int code, IntPtr wparam, IntPtr lparam);

        IntPtr MyHookProc(int code, IntPtr wparam, IntPtr lparam)
        {
            if (code < 0) return CallNextHookEx(_nextHookPtr, code, wparam, lparam); //返回,让后面的程序处理该消息
            if (wparam.ToInt32() == 98 || wparam.ToInt32() == 66) //如果用户输入的是 b
            {
                this.textBox1.Text += "a";
                return (IntPtr)1; //直接返回了,该消息就处理结束了
            }
            else
            {
                return IntPtr.Zero; //返回,让后面的程序处理该消息
            }
        }
        public void SetHook()
        {
            if (_nextHookPtr != IntPtr.Zero) //已经勾过了
                return;

            HookProc myhookProc = new HookProc(MyHookProc); //声明一个自己的Hook实现函数的委托对象

            _nextHookPtr = SetWindowsHookEx((int)HookType.Keyboard, myhookProc, IntPtr.Zero, GetCurrentThreadId()); //加到Hook链中
        }

        public void UnHook()
        {
            if (_nextHookPtr != IntPtr.Zero)
            {
                UnhookWindowsHookEx(_nextHookPtr); //从Hook链中取消
                _nextHookPtr = IntPtr.Zero;
            }
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            SetHook();
        }

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            UnHook();
        }

    }

【THX 4 the Code from ALAN (a C# programmer) http://www.cnblogs.com/hcfalan/archive/2006/06/19/429682.html

【Microsoft 对 hook 的解读:http://www.microsoft.com/china/community/program/originalarticles/techdoc/hook.mspx

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值