我的编程空间,编程开发者的网络收藏夹
学习永远不晚

基于C#实现简易的键盘记录器

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

基于C#实现简易的键盘记录器

利用HOOK技术来做一个键盘记录器,看看一天下来,我们点击了多少次键盘,哪些键的使用频率最高。

实现功能

使用C#实现一个键盘记录器

开发环境

开发工具: Visual Studio 2013

.NET Framework版本:4.5

实现代码

    public class HookUtil
   {
       #region windows api
 
       /// <summary>
       /// 安装钩子
       /// </summary>
       [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
        public static extern int SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hInstance, int threadId);
       public delegate int HookProc(int nCode, Int32 wParam, IntPtr lParam);
 
       /// <summary>
       /// 继续下一个钩子
       /// </summary>
       [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
       public static extern int CallNextHookEx(int idHook, int nCode, Int32 wParam, IntPtr lParam);
 
        /// <summary>
       /// 卸载钩子
        /// </summary>
        [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
        public static extern bool UnhookWindowsHookEx(int idHook);
 
       /// <summary>
        ///获取当前线程编号(线程钩子需要用到)
        [DllImport("kernel32.dll")]
        static extern int GetCurrentThreadId();
 
       /// <summary>
        /// 获取当前实例的函数
       /// </summary>
        [DllImport("kernel32.dll")]
        public static extern IntPtr GetModuleHandle(string name);
 
 
        /// <summary>
        /// 获取按键的状态
        /// </summary>
        /// <param name="pbKeyState"></param>
        /// <returns></returns>
        [DllImport("user32")]
        public static extern int GetKeyboardState(byte[] pbKeyState);
 
       /// <summary>
        /// 将指定的虚拟键码和键盘状态翻译为相应的字符或字符串
       /// </summary>
        [DllImport("user32")]
        public static extern int ToAscii(int uVirtKey, int uScanCode,   byte[] lpbKeyState,byte[] lpwTransKey,int fuState); 
       #endregion
 
        /// <summary>
        /// 键盘结构
        /// </summary>
        [StructLayout(LayoutKind.Sequential)]
        public class KeyboardHookStruct
        {
            public int vkCode;  //定一个虚拟键码。该代码必须有一个价值的范围1至254
            public int scanCode; // 指定的硬件扫描码的关键
            public int flags;  // 键标志
            public int time; // 指定的时间戳记的这个讯息
            public int dwExtraInfo; // 指定额外信息相关的信息
        }
 
       //定义为键盘钩子
        public int WH_KEYBOARD_LL = 13;
 
        //相关键盘事件
        public event KeyEventHandler KeyDownEvent;
        public event KeyPressEventHandler KeyPressEvent;
        public event KeyEventHandler KeyUpEvent;
 
       //相关动作
        private const int WM_KEYDOWN = 0x100;//KEYDOWN
        private const int WM_KEYUP = 0x101;//KEYUP
        private const int WM_SYSKEYDOWN = 0x104;//SYSKEYDOWN
        private const int WM_SYSKEYUP = 0x105;//SYSKEYUP
 
       //hookid
       private int hookID = 0;
 
       //向下传递数据
       public Keys NoNextKeyCode;
 
       /// <summary>
       /// 安装钩子
       /// </summary>
        public void StartHook()
        {
            if (hookID == 0)
            {
                HookProc hookProc = new HookProc(KeyboardHookProc);
                hookID = SetWindowsHookEx(WH_KEYBOARD_LL, hookProc, GetModuleHandle(System.Diagnostics.Process.GetCurrentProcess().MainModule.ModuleName), 0);
 
                if (hookID == 0)
                {
                    StopHook();
                    throw new Exception("安装键盘钩子失败");
                }
            }
        }
 
 
        public void StopHook()
        {
            bool isStop = true;
            if (hookID != 0)
            {
                isStop = UnhookWindowsHookEx(hookID);
                hookID = 0;
            }
            if (!isStop) throw new Exception("卸载键盘钩子失败!");
        }
 
       /// <summary>
       /// 监听事件
       /// </summary>
        private int KeyboardHookProc(int nCode, Int32 wParam, IntPtr lParam)
        {
            if ((nCode >= 0) && (KeyDownEvent != null || KeyUpEvent != null || KeyPressEvent != null))
            {
 
                KeyboardHookStruct MyKeyboardHookStruct = (KeyboardHookStruct)Marshal.PtrToStructure(lParam, typeof(KeyboardHookStruct));
            
                //按下处理
                if (KeyDownEvent != null && (wParam == WM_KEYDOWN || wParam == WM_SYSKEYDOWN))
                {
                    Keys keyData = (Keys)MyKeyboardHookStruct.vkCode;
                    KeyEventArgs e = new KeyEventArgs(keyData);
                     KeyDownEvent(this, e);
                    //阻止向下传递
                    if (NoNextKeyCode == keyData)
                    {
                        return hookID;
                    }
                }
 
                //按下并抬起处理
                if (KeyPressEvent != null && wParam == WM_KEYDOWN)
                {
                    byte[] keyState = new byte[256];
                    GetKeyboardState(keyState);
 
                    byte[] inBuffer = new byte[2];
                    if (ToAscii(MyKeyboardHookStruct.vkCode, MyKeyboardHookStruct.scanCode, keyState, inBuffer, MyKeyboardHookStruct.flags) == 1)
                    {
                        KeyPressEventArgs e = new KeyPressEventArgs((char)inBuffer[0]);
                        KeyPressEvent(this, e);
                    }
                }
 
                // 抬起处理
                if (KeyUpEvent != null && (wParam == WM_KEYUP || wParam == WM_SYSKEYUP))
                {
                    Keys keyData = (Keys)MyKeyboardHookStruct.vkCode;
                    KeyEventArgs e = new KeyEventArgs(keyData);
                    KeyUpEvent(this, e);
                }
 
            }
            return CallNextHookEx(hookID, nCode, wParam, lParam);
        }
 
        ~HookUtil()
        {
            StopHook();
        }
   }
  HookUtil keyHook = new HookUtil();
        private void btnBegin_Click(object sender, EventArgs e)
        {
            keyHook.KeyDownEvent += new KeyEventHandler(hook_KeyDown);//钩住按下事件
            keyHook.StartHook();
            btnBegin.Enabled = false;
            btnEnd.Enabled = true;
        }
 
        private void btnEnd_Click(object sender, EventArgs e)
        {
            keyHook.StopHook();
            btnBegin.Enabled = true;
            btnEnd.Enabled = false;
        }
 
        private void btnInfo_Click(object sender, EventArgs e)
        {
            string path = System.AppDomain.CurrentDomain.BaseDirectory + "log\\" + DateTime.Now.ToString("yyyy-MM-dd") + ".txt";
            if (!File.Exists(path))
            {
                MessageBox.Show("还未监听到数据,请操作后再查看");
                return;
            }
            var list = File.ReadAllLines(path).ToList().GroupBy(s => s).Select(s => new { s.Key, s.ToList().Count }).OrderByDescending(s => s.Count);
            FrmInfo frm = new FrmInfo();
            frm.Show();
            foreach (var item in list)
            {
                frm.addItems(new string[] { "", item.Key, item.Count + "" });
            }
 
        }
  private void hook_KeyDown(object sender, KeyEventArgs e)
        {
            if (!listKey.Contains(e.KeyData))
            {
                if (Control.ModifierKeys != Keys.None)
                {
                    WriteLog(Control.ModifierKeys + "+" + e.KeyData);
                }
                else
                {
                    WriteLog(e.KeyData + "");
                }
            }
            else
            {
                WriteLog(e.KeyData + "");
            }
 
        }

实现效果

以上就是基于C#实现简易的键盘记录器的详细内容,更多关于C#键盘记录器的资料请关注编程网其它相关文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

基于C#实现简易的键盘记录器

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

基于C语言如何实现简易的扫雷游戏

这篇文章主要讲解了“基于C语言如何实现简易的扫雷游戏”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“基于C语言如何实现简易的扫雷游戏”吧!扫雷即在一个棋盘中,随机放入一定数量的雷,玩家通过输入
2023-06-30

基于python的Tkinter实现一个简易计算器

本文实例介绍了基于python的Tkinter实现简易计算器的详细代码,分享给大家供大家参考,具体内容如下 第一种:使用python 的 Tkinter实现一个简易计算器#coding:utf-8 from Tkinter import *
2022-06-04

基于C#实现获取本地磁盘目录

这篇文章主要为大家详细介绍了如何利用C#实现获取本地磁盘目录的功能,文中的示例代码讲解详细,对我们学习C#有一定的帮助,感兴趣的小伙伴可以跟随小编一起了解一下
2022-12-26

利用Python+PyQt5实现简易浏览器的实战记录

目录实验环境依赖项安装编程实现浏览器有一个可以用于展示网页的窗口代码总结实验环境操作系统:Linux Mint编辑器:vim编程语言:python3依赖项安装安装PyQt5 Qt是一个跨平台的C++应用程序开发框架sudo apt-get
2022-06-02

基于Java实现简易的七星彩号码生成器

七星彩是中国体育彩票的一种玩法,由中国国家体育总局体育彩票管理中心统一发行。本文为大家准备了一个七星彩号码生成器Java工具类,感兴趣的可以了解一下
2022-11-13

基于Python+Tkinter怎么实现一个简易计算器

这篇文章主要介绍“基于Python+Tkinter怎么实现一个简易计算器”,在日常操作中,相信很多人在基于Python+Tkinter怎么实现一个简易计算器问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”基于P
2023-06-26

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录