专栏首页一路走一路失去也一路拥有键盘钩子之完美得到单键或多组合键的信息

键盘钩子之完美得到单键或多组合键的信息

【先看代码】

    class KeyboardHook
    {
        #region 私有变量
        private IntPtr m_pKeyboardHook = IntPtr.Zero;/// 键盘钩子句柄
        private delegate int HookProc(int nCode, Int32 wParam, IntPtr lParam);/// 钩子委托声明
        private HookProc m_KeyboardHookProcedure;/// 键盘钩子委托实例
        public const int idHook = 13;/// 底层的钩子变量
        [DllImport("user32.dll", CallingConvention = CallingConvention.StdCall)]
        private static extern IntPtr SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr pInstance, int threadId);/// 安装钩子
        [DllImport("user32.dll", CallingConvention = CallingConvention.StdCall)]/// 卸载钩子
        private static extern bool UnhookWindowsHookEx(IntPtr pHookHandle);
        [DllImport("kernel32.dll")]
        private static extern IntPtr GetModuleHandle(string name);
        /// 传递钩子
        /// <param name="pHookHandle">是您自己的钩子函数的句柄。用该句柄可以遍历钩子链</param>
        /// <param name="nCode">把传入的参数简单传给CallNextHookEx即可</param>
        /// <param name="wParam">把传入的参数简单传给CallNextHookEx即可</param>
        /// <param name="lParam"></param>
        /// <returns></returns>
        [DllImport("user32.dll", CallingConvention = CallingConvention.StdCall)]
        private static extern int CallNextHookEx(IntPtr pHookHandle, int nCode, Int32 wParam, IntPtr lParam);
        [StructLayout(LayoutKind.Sequential)]
        private struct KeyMSG
        {
            public int vkCode;
            public int scanCode;
            public int flags;
            public int time;
            public int dwExtraInfo;
        }
        protected const int WM_QUERYENDSESSION = 0x0011;
        protected const int WM_KEYDOWN = 0x100;
        protected const int WM_KEYUP = 0x101;
        protected const int WM_SYSKEYDOWN = 0x104;
        protected const int WM_SYSKEYUP = 0x105;
        protected const byte VK_SHIFT = 0x10;
        protected const byte VK_CAPITAL = 0x14;
        protected const byte VK_NUMLOCK = 0x90;
        protected const byte VK_LSHIFT = 0xA0;
        protected const byte VK_RSHIFT = 0xA1;
        protected const int VK_LWIN = 91;
        protected const int VK_RWIN = 92;
        protected const byte VK_LCONTROL = 0xA2;
        protected const byte VK_RCONTROL = 0x3;
        protected const byte VK_LALT = 0xA4;
        protected const byte VK_RALT = 0xA5;
        protected const byte LLKHF_ALTDOWN = 0x20;
        private static int pp = 0;//热键的返回值
        private static bool isInstall = false;//是否安装钩子,true为安装
        #endregion

        #region 事件的声明
        /// <summary>
        /// 返回数据委托
        /// </summary>
        /// <param name="Key"></param>
        public delegate void _RetKey(string Key);
        /// <summary>
        /// 返回按下的键盘数据
        /// </summary>
        public _RetKey RteKey;
        #endregion

        #region 方法
        /// <summary>
        /// 钩子捕获消息后,对消息进行处理
        /// </summary>
        /// <param nCode="int">标识,键盘是否操作</param> 
        /// <param wParam="int">键盘的操作值</param>
        /// <param lParam="IntPtr">指针</param>
        private int KeyboardHookProc(int nCode, int wParam, IntPtr lParam)
        {
            if (nCode > -1)
            {
                KeyMSG keyboardHookStruct = (KeyMSG)Marshal.PtrToStructure(lParam, typeof(KeyMSG));//获取钩子的相关信息
                KeyEventArgs e = new KeyEventArgs((Keys)(keyboardHookStruct.vkCode));//获取KeyEventArgs事件的相磁信息
                switch (wParam)
                {
                    case WM_KEYDOWN://键盘按下操作
                    case WM_SYSKEYDOWN:
                        Shun_KeyDown(e);//调用该事件
                        break;
                    case WM_KEYUP://键盘松开操作
                    case WM_SYSKEYUP:
                        Shun_KeyUp(e);//调用该事件
                        break;
                }
            }
            return pp;//是否屏蔽当前热键,1为屏蔽,2为执行
        }
        /// <summary>
        /// 按下的键码集合
        /// </summary>
        Dictionary<string, int> keyValuePairs = new Dictionary<string, int>();
        /// <summary>
        /// 按下
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Shun_KeyDown(KeyEventArgs e)
        {
            if (!keyValuePairs.ContainsKey(e.KeyData.ToString()))
            {
                if (e.KeyData == Keys.LShiftKey || e.KeyData == Keys.RShiftKey)
                {
                    if (!keyValuePairs.ContainsKey(Keys.Shift.ToString()))
                    {
                        keyValuePairs.Add(Keys.Shift.ToString(), (int)Keys.Shift);
                    }
                }
                else if (e.KeyData == Keys.LControlKey || e.KeyData == Keys.RControlKey)
                {
                    if (!keyValuePairs.ContainsKey(Keys.Control.ToString()))
                    {
                        keyValuePairs.Add(Keys.Control.ToString(), (int)Keys.Control);
                    }
                }
                else if (e.KeyData == Keys.LMenu || e.KeyData == Keys.RMenu)
                {
                    if (!keyValuePairs.ContainsKey(Keys.Alt.ToString()))
                    {
                        keyValuePairs.Add(Keys.Alt.ToString(), (int)Keys.Alt);
                    }
                }
                else
                {
                    keyValuePairs.Add(e.KeyData.ToString(), e.KeyValue);
                }
            }
        }
        /// <summary>
        /// 松开
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Shun_KeyUp(KeyEventArgs e)
        {
            List<string> ListData = new List<string>();
            string RetKeyCode = string.Empty;
            var DicSort = from objDic in keyValuePairs orderby objDic.Value descending select objDic;  //倒叙
            //var DicSort = from objDic in keyValuePairs orderby objDic.Value select objDic;  //升序
            foreach (KeyValuePair<string, int> Data in DicSort)
            {
                RetKeyCode += Data.Key + " + ";
                ListData.Add(Data.Key);
            }
            for (int i = 0; i < ListData.Count; i++)
            {
                keyValuePairs.Remove(ListData[i]);
            }
            if (!RetKeyCode.Equals(""))
            {
                RteKey(RetKeyCode.Substring(0, RetKeyCode.Length - 3));
            }
        }
        #endregion
        
        #region 安装、卸载钩子
        /// <summary>
        /// 安装钩子
        /// </summary>
        /// <returns>是否安装成功</returns>
        public bool Start()
        {
            if (this.m_pKeyboardHook == IntPtr.Zero)//如果键盘的句柄为空
            {
                this.m_KeyboardHookProcedure = new HookProc(KeyboardHookProc);//声明一个托管钩子
                this.m_pKeyboardHook = SetWindowsHookEx(idHook, m_KeyboardHookProcedure, GetModuleHandle(Process.GetCurrentProcess().MainModule.ModuleName), 0);//安装钩子
                if (this.m_pKeyboardHook == IntPtr.Zero)//如果安装失败
                {
                    this.Stop();//卸载钩子
                    return false;
                }
            }
            isInstall = true;//安装了钩子
            return true;
        }
        /// <summary>
        /// 卸载钩子
        /// </summary>
        /// <returns>是否卸载成功</returns>
        public bool Stop()
        {
            if (isInstall == false)//如果没有安装钩子
            {
                return true;
            }
            bool result = true;
            if (this.m_pKeyboardHook != IntPtr.Zero)//如果安装了钩子
            {
                result = (UnhookWindowsHookEx(this.m_pKeyboardHook) && result);//卸载钩子
                this.m_pKeyboardHook = IntPtr.Zero;//清空键盘的钩子句柄
            }
            return result;
        }
        #endregion 公共方法
    }

【实现流程】

        KeyboardHook keyboardHook = new KeyboardHook();
        //开始
        private void button1_Click(object sender, EventArgs e)
        {
            keyboardHook.Start();  //绑定钩子
            keyboardHook.RteKey += Info;  //绑定事件
            button2.Enabled = true;
            button1.Enabled = false;
        }
        /// <summary>
        ///数据返回
        /// </summary>
        /// <param name="Key"></param>
        public void Info(string Key)
        {
            textBox1.Text += Key+"\r\n";
        }
        //关闭
        private void button2_Click(object sender, EventArgs e)
        {
            keyboardHook.Stop();  //拆卸钩子
            button1.Enabled = true;
            button2.Enabled = false;
        }

【运行结果】

简简单单,记得点赞分享哦    

本文作者:[博主]大顺

本文链接:https://shunnet.top/fYVZ7j

版权声明:转载注明出处,谢谢

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • WPF 拼音输入法

    实际上本文是在使用一个好用的软件 希沃白板 的时候发现在里面很难输入拼音来做课堂活动。

    林德熙
  • HOOK专题[来自微软中国社区] [钩子]

    钩子(Hook),是Windows消息处理机制的一个平台,应用程序可以在上面设置子程以监视指定窗口的某种消息,而且所监视的窗口可以是其他进程所创建的。当消息到达...

    冰封一夏
  • qq安全原理

        故事总要有缘由,那么这个故事的缘由就是,当我以前写了一个获取其它进程密码框密码的时候(前几篇博客中有描述),我抱着试一试的心情去试探了一下能不能得到 Q...

    xiangzhihong
  • Altium Dsigner18——应用操作技巧总结

          2年多没用这软件了,很多东西都忘了,记下来方便后续查看应用,下面的是边用边想到的,没有什么逻辑顺序(我用的AD18)。

    Winter_world
  • Python编写渗透工具学习笔记一 | 0x07 Python实现键盘记录器

    0x07 Python实现键盘记录器 这份代码比较经典,里面的注释也写的很详细,我也就直接放出来给大家一起学习一下。 简单说一说 我们定义了pyhook的hoo...

    安恒网络空间安全讲武堂
  • 漫漫学习路之Hook总结

    本篇文章是之前我在学习Android Hook技术时的学习总结。闲来无事,回头看到笔记时已发现蜘蛛网已经封存了我的秘籍,辛亏打开一看,My Study总...

    天钧
  • 木马盗号《一》

    久前看了一些安全方面的书籍。在看完了《计算机病毒揭秘与对抗》---王倍昌书 以后,打算找个目标试试手。首先说明下,本次使用的技术都是很平常的,也就是说是病毒基础...

    知识与交流
  • Macbook Pro键帽拆解安装图文教程

    前段时间把可乐洒在电脑上了,大概有1/5的罐装可乐,紧急之下把电脑翻转过来,万幸的是电脑没出问题。就是过了两天之后,键盘黏黏的,特别是空格键。 送修的话,这属...

    Jingbin
  • Python 键盘鼠标监听

    异想天开的想记录一下自己每天的键盘键位走向,于是就在网上搜索了一下相关的实现,然后就发现了一个第三方的库pyHook.封装的很好,我们只需要傻瓜式的调用里面的A...

    py3study
  • 【爬虫知识】浏览器开发者工具使用技巧总结

    常见禁用开发者工具手段:https://blog.csdn.net/cplvfx/article/details/108518077

    K哥爬虫
  • 38个诈骗界最流行的“黑话”,这些黑话你都掌握了吗?

    黑话,最先兴起于中国封建社会时期,是指由民间各个帮派、团体创制的一套复杂的隐语体系,其主要目的是方便内部沟通而不被外人发现。可是你知道吗?随着各类诈骗特别是电信...

    C4rpeDime
  • 揭秘webpack插件工作流程和原理

    通过插件我们可以扩展webpack,在合适的时机通过Webpack提供的 API 改变输出结果,使webpack可以执行更广泛的任务,拥有更强的构建能力。 本文...

    前端迷
  • 制作信息图的“核心信条”

    大数据文摘
  • Git Pro深入浅出(三)

    前面已经阐述了Git基本的运作机制和使用方式,介绍了许多Git提供的工具来帮助你简单且有效地使用它。本部分将演示如何借助Git的一些重要的配置方法和钩子机制,来...

    奋飛
  • XSS平台模块拓展 | 内附42个js脚本源码

    一个非常简单的键盘记录程序,可捕获击键并将其每秒发送到外部页面.JS和PHP代码在归档中提供的PHP。

    HACK学习
  • 干货 | React Fiber 初探

    携程技术
  • 揭秘盗取“羊毛党”比特币的钓鱼攻击事件 | 一例C2服务器跟踪分析报告

    1 概述 行文之前先界定两个概念。 羊毛党,指关注与热衷于“薅羊毛”的群体,是指那些专门选择企业的营销活动、广告投放等,以低成本甚至零成本来换取高额奖励的人。早...

    FB客服
  • vue 学习笔记第二弹

    概念:Vue.js 允许你自定义过滤器,可被用作一些常见的文本格式化。过滤器可以用在两个地方:mustache 插值和 v-bind 表达式。过滤器应该被添加在...

    syy
  • pytest文档70-Hook钩子函数完整API总结​

    pytest 的钩子函数有很多,通过钩子函数的学习可以了解到pytest在执行用例的每个阶段做什么事情,也方便后续对pytest二次开发学习。 详细文档可以查看...

    上海-悠悠

扫码关注云+社区

领取腾讯云代金券