HOOK in C#

来源:互联网 发布:亚马逊云 windows 编辑:程序博客网 时间:2024/05/29 19:55


hook 键盘

using System;
using System.Windows.Forms;
using System.Runtime.InteropServices;


namespace WinForm
{
    public partial class tt : Form
    {
        public tt()
        {
            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() == 13)
            {
                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();
        }
    }
}

0 0
原创粉丝点击