返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >基于C#实现简易的键盘记录器
  • 810
分享到

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

2024-04-02 19:04:59 810人浏览 薄情痞子
摘要

目录实现功能开发环境实现代码实现效果利用HOOK技术来做一个键盘记录器,看看一天下来,我们点击了多少次键盘,哪些键的使用频率最高。 实现功能 使用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#键盘记录器的资料请关注编程网其它相关文章!

--结束END--

本文标题: 基于C#实现简易的键盘记录器

本文链接: https://lsjlt.com/news/165679.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 基于C#实现简易的键盘记录器
    目录实现功能开发环境实现代码实现效果利用HOOK技术来做一个键盘记录器,看看一天下来,我们点击了多少次键盘,哪些键的使用频率最高。 实现功能 使用C#实现一个键盘记录器 开发环境 ...
    99+
    2024-04-02
  • 基于JavaScript实现简易计算器
    本文实例为大家分享了JavaScript实现简易计算器的具体代码,供大家参考,具体内容如下 <!DOCTYPE html> <html lang="en"&g...
    99+
    2024-04-02
  • 基于C语言实现简易的扫雷游戏
    对于C语言学习者来说,在完成C语言初级学习之后,扫雷游戏是一个很好的知识的总结和练习。 扫雷即在一个棋盘中,随机放入一定数量的雷,玩家通过输入坐标,得到坐标上的信息(以此点为中心四周...
    99+
    2024-04-02
  • 基于C语言实现简易扫雷游戏
    本文实例为大家分享了C语言实现简易扫雷游戏的具体代码,供大家参考,具体内容如下 1、头文件 #define _CRT_SECURE_NO_WARNINGS //包含头文件 #incl...
    99+
    2024-04-02
  • 基于C语言实现简易三子棋游戏
    用C语言写三子棋的具体代码,供大家参考,具体内容如下 1、头文件 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> ...
    99+
    2024-04-02
  • 基于C语言如何实现简易的扫雷游戏
    这篇文章主要讲解了“基于C语言如何实现简易的扫雷游戏”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“基于C语言如何实现简易的扫雷游戏”吧!扫雷即在一个棋盘中,随机放入一定数量的雷,玩家通过输入...
    99+
    2023-06-30
  • 基于python的Tkinter实现一个简易计算器
    本文实例介绍了基于python的Tkinter实现简易计算器的详细代码,分享给大家供大家参考,具体内容如下 第一种:使用python 的 Tkinter实现一个简易计算器 #coding:utf-8 ...
    99+
    2022-06-04
    计算器 简易 python
  • 基于Python实现简易的自制头像神器
    目录前言正文1)原理简介2)准备中3)代码展示4)效果展示前言 都说新年新气象,所以,为了迎接2022年的到来! 小编决定换一波头像——于是问题来了!换一个什...
    99+
    2024-04-02
  • 基于Python+Tkinter实现一个简易计算器
    目录设计原理示例效果主要代码设计原理 从结构上来说,一个简单的图形界面,需要由界面组件、组件的事件监听器(响应各类事件的逻辑)和具体的事件处理逻辑组成。界面实现的主要工作是创建各个界...
    99+
    2024-04-02
  • 基于C#实现获取本地磁盘目录
    目录实践过程效果代码实践过程 效果 代码 class BaseClass { public class Win32 { public const u...
    99+
    2022-12-26
    C#获取本地磁盘目录 C#获取磁盘目录 C# 磁盘目录
  • 利用Python+PyQt5实现简易浏览器的实战记录
    目录实验环境依赖项安装编程实现浏览器有一个可以用于展示网页的窗口代码总结实验环境 操作系统:Linux Mint 编辑器:vim 编程语言:python3 依赖项安装 安装PyQt5 ...
    99+
    2022-06-02
    python pyqt5浏览器 python pyqt5教程 python开发浏览器
  • C++实现简易通讯录功能
    目录实现功能一、定义通讯录和通讯录人员结构体二、实现通讯录输入菜单1.定义菜单函数:2.主函数循环体中循环展示菜单信息三、实现增删改查和清空通讯录功能四、运行截图展示本文实例为大家分...
    99+
    2024-04-02
  • 基于Python实现简易的动漫图片转换器
    本文旨在制作一个将普通照片转换成动漫图片的小工具,其中使用opencv的非标准库实现对图片完成转换。 UI界面的制作使用的还是pyqt5,因为用习惯了使用起来相当方便,接下来还是先...
    99+
    2024-04-02
  • C#实现简易的计算器
    本文实例为大家分享了C#实现简易的计算器的具体代码,供大家参考,具体内容如下 1 题目描述 (1)Form1窗体设计界面如下: (2)运算类型的下列列表中包括:加法、减法、乘法、除...
    99+
    2024-04-02
  • 基于Python实现简易文档格式转换器
    目录需求分析开发环境引用模块UI界面代码块格式转换主要代码块效果展示最近看到市场上各种的文档格式转换软件,要么是收费、要么是有大量的广告。于是学习了一下 PyQt5 的页面操作,再加...
    99+
    2024-04-02
  • 基于Pythonsocket实现简易网络聊天室
    目录1.socket_ui.py 服务端1-1. 依赖引用1-2. 实现过程1-3. 实现效果2.client_ui.py 客户端2-1. 依赖引用2-2. 实现过程2-3. 实现效...
    99+
    2024-04-02
  • 基于three.js实现简易照片墙效果
    学习three.js的过程中,写的一个简易照片墙,可以使用鼠标滚轮上下浏览,采用的是移动相机的方式。 代码贴出来,供学习这一块的朋友们参考和指导:  <!DOCTYPE HTM...
    99+
    2024-04-02
  • C语言实现简易通讯录实例
    目录一、问题描述二、功能介绍二、实现流程1.创建通讯录2.创建源文件test.c3.创建源文件contact.c4.删除通讯录联系人信息 (DelContact函数实现)5...
    99+
    2024-04-02
  • 基于Qt实现简易GIF播放器的示例代码
    目录一、项目介绍二、项目基本配置三、UI界面设计四、主程序实现4.1 mainwindow.h头文件4.2 mainwindow.cpp源文件五、效果演示一、项目介绍 利用Qt设计一...
    99+
    2024-04-02
  • 基于Java实现简易的七星彩号码生成器
    目录题目描述:七星彩号码生成器一、题目二、解题思路三、代码详解题目描述:七星彩号码生成器 一、题目 七星彩是中国体育彩票的一种玩法,由中国国家体育总局体育彩票管理中心统一发行,200...
    99+
    2022-11-13
    Java七星彩号码生成器 Java 号码生成器 Java 号码生成
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作