HOOK in C#

 

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值