c#如何使用windows的挂钩技术

C# 中可以使用 Windows 挂钩技术来监视和控制系统级别的事件,如键盘和鼠标输入。以下是一个简单的示例,展示如何使用 C# 开发 Windows 挂钩技术。

首先,需要导入 System.Runtime.InteropServices 命名空间来使用 Windows API 中的函数。然后定义一个回调函数,该函数会在钩子被触发时被调用。

using System;
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace KeyboardHook
{
    class Program
    {
        private static IntPtr hookId = IntPtr.Zero;

        static void Main(string[] args)
        {
            hookId = SetHook(HookCallback);
            Application.Run();
            UnhookWindowsHookEx(hookId);
        }

        private static IntPtr SetHook(HookProc proc)
        {
            using (ProcessModule curModule = Process.GetCurrentProcess().MainModule)
            {
                return SetWindowsHookEx(WH_KEYBOARD_LL, proc, GetModuleHandle(curModule.ModuleName), 0);
            }
        }

        private delegate IntPtr HookProc(int nCode, IntPtr wParam, IntPtr lParam);

        private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam)
        {
            if (nCode >= 0 && wParam == (IntPtr)WM_KEYDOWN)
            {
                int vkCode = Marshal.ReadInt32(lParam);
                Console.WriteLine((Keys)vkCode);
            }
            return CallNextHookEx(hookId, nCode, wParam, lParam);
        }

        private const int WH_KEYBOARD_LL = 13;
        private const int WM_KEYDOWN = 0x0100;

        [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        private static extern IntPtr SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hMod, uint dwThreadId);

        [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        [return: MarshalAs(UnmanagedType.Bool)]
        private static extern bool UnhookWindowsHookEx(IntPtr hhk);

        [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        private static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam, IntPtr lParam);

        [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        private static extern IntPtr GetModuleHandle(string lpModuleName);
    }
}

这个程序创建了一个低级别的键盘挂钩,当用户按下任何键时,它将在控制台中打印该键的名称。如果需要在键盘挂钩的回调中执行其他操作,可以将相关的代码放在if语句块中。
python库的简单实例及介绍
python傻瓜式入门
人间清醒
量化交易策略介绍
linux系统相关 - 知乎 (zhihu.com)

python 如何给文件改名
如何执行python setup.py
python 如何写入文本文件?
Python 如何获取文件路径?
如何在 Python 中逐行读取文件名到列表中?
Pandas如何处理excel列中数据?
如何在 Python 中逐行读取一个文件到列表?
python 给初学者的建议
python 获取文件夹下文件列表(不递归)
python hello world
python 生成随机数
python编程示例系列
python的injectool库
ANTLR 强大的语法分析器生成器
python的Pybooru库
量化对冲交易系统设计二
量化对冲交易系统设计一
python的string 竟然有这么多用法
python给游戏增加音效
python 只用20行代码完成一个web应用开发

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

openwin_top

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值