c# 使用hook来监控鼠标键盘事件的示例代码

如果这个程序在10几年前,QQ刚刚兴起的时候,有了这个代码,就可实现盗号了.

当然使用钩子我们更多的是实现"全局快捷键"的需求.

比如 程序最小化隐藏后要"某快捷键"来启动它.

钩子(hook),通俗的讲,她可以捕获到你的键盘和鼠标的相关操作消息.

 

关于hook的相关代码网上一搜一箩筐,这是整理起来比较完善和使用最方便的.

  


注意:
如果运行中出现SetWindowsHookEx的返回值为0,这是因为.net 调试模式的问题,具体的做法是禁用宿主进程,在 Visual Studio 中打开项目。
在“项目”菜单上单击“属性”。
单击“调试”选项卡。
清除“启用 Visual Studio 宿主进程(启用windows承载进程)”复选框 或 勾选启用非托管代码调试

使用示例:

      

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
/// <summary>
        /// 声明一个hook对象
        /// </summary>
        GlobalHook hook;
 
        private void Form1_Load(object sender, EventArgs e)
        {
            btnInstallHook.Enabled = true;
            btnUnInstall.Enabled = false;
            //初始化钩子对象
            if (hook == null)
            {
                hook = new GlobalHook();
                hook.KeyDown += new KeyEventHandler(hook_KeyDown);
                hook.KeyPress += new KeyPressEventHandler(hook_KeyPress);
                hook.KeyUp += new KeyEventHandler(hook_KeyUp);
                hook.OnMouseActivity += new MouseEventHandler(hook_OnMouseActivity);
            }
        }
        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (btnUnInstall.Enabled == true)
            {
                hook.Stop();
            }
        }
 
        private void btnInstallHook_Click(object sender, EventArgs e)
        {
            if (btnInstallHook.Enabled == true)
            {
                bool r = hook.Start();
                if (r)
                {
                    btnInstallHook.Enabled = false;
                    btnUnInstall.Enabled = true;
                    MessageBox.Show("安装钩子成功!");
                }
                else
                {
                    MessageBox.Show("安装钩子失败!");
                }
            }
        }
        private void btnUnInstall_Click(object sender, EventArgs e)
        {
            if (btnUnInstall.Enabled == true)
            {
                hook.Stop();
                btnUnInstall.Enabled = false;
                btnInstallHook.Enabled = true;
                MessageBox.Show("卸载钩子成功!");
            }
        }
 
        /// <summary>
        /// 鼠标移动事件
        /// </summary>
        void hook_OnMouseActivity(object sender, MouseEventArgs e)
        {
            lbMouseState.Text = "X:" + e.X + " Y:" + e.Y;
        }
        /// <summary>
        /// 键盘抬起
        /// </summary>
        void hook_KeyUp(object sender, KeyEventArgs e)
        {
            lbKeyState.Text = "键盘抬起, " + e.KeyData.ToString() + " 键码:" + e.KeyValue;
        }
        /// <summary>
        /// 键盘输入
        /// </summary>
        void hook_KeyPress(object sender, KeyPressEventArgs e)
        { }
        /// <summary>
        /// 键盘按下
        /// </summary>
        void hook_KeyDown(object sender, KeyEventArgs e)
        {
            lbKeyState.Text = "键盘按下, " + e.KeyData.ToString() + " 键码:" + e.KeyValue;
        }

 

 如果想捕获鼠标按下抬起的事件,可以修改  GlobalHook 类的 MouseHookProc方法相关代码

 

 示例代码下载 

 

posted @   老张一笑  阅读(6363)  评论(3编辑  收藏  举报
编辑推荐:
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
阅读排行:
· DeepSeek “源神”启动!「GitHub 热点速览」
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· 2 本地部署DeepSeek模型构建本地知识库+联网搜索详细步骤
点击右上角即可分享
微信分享提示