• C#代码设置系统钩子


    系统钩子

    曾经有一段时间特别迷恋外挂程序,因此有所了解,但仅限于皮毛,由于缺乏的知识太多就放弃了,最近有个私活需要用到钩子,所以重行来研究一番,其实也谈不上研究,我是一个C#程序员,本来就没有多少系统的知识(并不是每个C#程序员都是这样),使用win32 api对我来说还是有些困难的,所以不能给出多么高深的讲解,这里仅限于我是如何使用C#调用win32 api来实现系统钩子的。
    

    什么是钩子

    我不觉得自己能说清楚什么是钩子,所以我推荐大家看一些 钩子简介

    项目需求:

    实现一个程序来禁用所有鼠标按键,禁用任务管理器,禁用注册表等。
    

    涉及Win32 API

    1. SetWindowsHookEx (参考)
    2. UnhookWindowsHookEx (参考)

    代码实现

    1. 要使用钩子首先我们得有一个钩子

      我的钩子代码

      //定义个委托类型,因为设置钩子的时候需要这种类型的委托实现
      private delegate int HookProc(int nCode,IntPtr wparam,ref IntPtr lparam);
      
      //实现HookProc委托签名的方法
      private static int HookProcCallback(int nCode, IntPtr wparam, ref IntPtr lparam)
      {
          //这里可以进行消息的过滤,返回0时所有的消息都不会进入下一个钩子
          return 0;
      }
      
    2. 设置钩子到系统的钩子链中

      SetWindowsHookEx的定义的参数:

      1. 钩子的类型,即它处理的消息类型(比如:键盘钩子,鼠标钩子,Shell钩子等)
      2. 钩子回调函数,即接收的消息由谁处理
      3. 需要钩子拦截的程序句柄,0/null为当前进程/模块,
      4. 是否为全局钩子,如果为0则与所有线程关联,即全局钩子;否则,这个线程一定属性上一个参数对应的进程/模块

      设置钩子代码

      //定义一个钩子实例
      var hookProc = new HookProc(HookProcCallback);
      //设置钩子
      hKeyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL, proc, null, 0);
      if(hkeyboardHook!=IntPtr.Zero){
          //设置成功
      }
      

    完整代码

    public class Hook
    {
        // 设置钩子
        [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        public static extern IntPtr SetWindowsHookEx(int idHook, HookHandlerDelegate lpfn, IntPtr hmod, uint dwThreadID);
    
        // 卸载钩子 
        [DllImport("user32.dll")]
        public static extern bool UnhookWindowsHookEx(IntPtr idHook);
    
        // 获取模块句柄
        [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        public static extern IntPtr GetModuleHandle(String modulename);
        public const int WM_KEYDOWN = 0x0100;
        public const int WH_KEYBOARD_LL = 13;
        public const int WM_SYSKEYDOWN = 0x0104;
        public struct KBDLLHOOKSTRUCT
        {
            public int vkCode;
            public int scanCode;
            public int flags;
            public int time;
            public int dwExtraInfo;
        }
        public delegate int HookHandlerDelegate(int nCode, IntPtr wparam, ref KBDLLHOOKSTRUCT lparam);
        //钩子回掉委托实例
        private static HookHandlerDelegate proc;
        //钩子句柄
        private static IntPtr hKeyboardHook;
    
        private static int HookCallback(int nCode, IntPtr wparam, ref KBDLLHOOKSTRUCT lparam)
        {
            if (
                nCode >= 0
                &&
                (wparam == (IntPtr)WM_KEYDOWN
                ||
                wparam == (IntPtr)WM_SYSKEYDOWN)
                )
            {
                if (lparam.vkCode == 91 || lparam.vkCode == 164 || lparam.vkCode == 9 || lparam.vkCode == 115)
                {
                    return 1;
                }
                else
                {
                    return 0;
                }
            }
            return 0;
        }
    
        public static void HookStart()
        {
            if (hKeyboardHook == IntPtr.Zero)
            {
                // 创建HookProc实例 
                proc = new HookHandlerDelegate(HookCallback);
                using (Process curPro = Process.GetCurrentProcess())
                using (ProcessModule curMod = curPro.MainModule)
                {
                    //定义全局钩子 
                    hKeyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL, proc,GetModuleHandle(curMod.FileName), 0);
                }
    
                if (hKeyboardHook == IntPtr.Zero)
                {
                    HookStop();
                    throw new Exception("钩子设置失败");
                }
            }
    
        }
    
        public static void HookStop()
        {
            bool retKeyboard = true;
            if (hKeyboardHook != IntPtr.Zero)
            {
                retKeyboard = UnhookWindowsHookEx(hKeyboardHook);
                hKeyboardHook = IntPtr.Zero;
            }
            if (!(retKeyboard)) throw new Exception("卸载钩子失败");
    
        }
    }
    
  • 相关阅读:
    HDU 3555 Bomb (数位DP)
    ms sqlserver数据库主文件特别大怎么办
    w3wp.exe占用cpu特别高
    Excel的数据批量替换
    用Excel的分列功能格式化时间
    sql cte的使用
    数据结构
    http与浏览器学习
    长方形裁切优化与矩形物料排料
    架构知识
  • 原文地址:https://www.cnblogs.com/guodf/p/6656900.html
Copyright © 2020-2023  润新知