legongju.com
我们一直在努力
2025-01-09 14:18 | 星期四

在C#项目中如何管理全局钩子

在C#项目中,可以使用全局钩子(Global Hooks)来监视和捕获系统范围内的键盘和鼠标事件

  1. 首先,需要添加对System.Windows.FormsSystem.Runtime.InteropServices命名空间的引用。
using System;
using System.Windows.Forms;
using System.Runtime.InteropServices;
  1. 定义一个类来处理全局钩子。在这个类中,我们将使用P/Invoke来调用Windows API函数。
public class GlobalHook
{
    // 定义钩子类型
    public enum HookType
    {
        WH_KEYBOARD_LL = 13,
        WH_MOUSE_LL = 14
    }

    // 定义鼠标钩子结构体
    [StructLayout(LayoutKind.Sequential)]
    public struct MouseHookStruct
    {
        public Point pt;
        public int hwnd;
        public int wHitTestCode;
        public int dwExtraInfo;
    }

    // 定义键盘钩子结构体
    [StructLayout(LayoutKind.Sequential)]
    public struct KeyboardHookStruct
    {
        public int vkCode;
        public int scanCode;
        public int flags;
        public int time;
        public int dwExtraInfo;
    }

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

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

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

    // 导入GetModuleHandle函数
    [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    private static extern IntPtr GetModuleHandle(string lpModuleName);

    // 定义钩子回调委托
    public delegate IntPtr HookProc(int nCode, IntPtr wParam, IntPtr lParam);

    // 定义钩子事件
    public event EventHandler MouseEvent;
    public event EventHandler KeyEvent;

    private IntPtr _hookID = IntPtr.Zero;
    private readonly HookProc _hookProc;

    public GlobalHook()
    {
        _hookProc = HookCallback;
    }

    // 安装钩子
    public void InstallHook(HookType hookType)
    {
        if (_hookID != IntPtr.Zero)
            return;

        IntPtr moduleHandle = GetModuleHandle(null);
        _hookID = SetWindowsHookEx((int)hookType, _hookProc, moduleHandle, 0);
    }

    // 卸载钩子
    public void UninstallHook()
    {
        if (_hookID == IntPtr.Zero)
            return;

        UnhookWindowsHookEx(_hookID);
        _hookID = IntPtr.Zero;
    }

    // 钩子回调函数
    private IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam)
    {
        if (nCode >= 0)
        {
            if (_hookID != IntPtr.Zero)
            {
                switch ((HookType)_hookID.ToInt32())
                {
                    case HookType.WH_MOUSE_LL:
                        MouseHookStruct mouseData = https://www.yisu.com/ask/(MouseHookStruct)Marshal.PtrToStructure(lParam, typeof(MouseHookStruct));>
  1. 在你的应用程序中使用GlobalHook类来监听键盘和鼠标事件。
public partial class MainForm : Form
{
    private readonly GlobalHook _globalHook;

    public MainForm()
    {
        InitializeComponent();

        _globalHook = new GlobalHook();
        _globalHook.MouseEvent += OnMouseEvent;
        _globalHook.KeyEvent += OnKeyEvent;
    }

    protected override void OnLoad(EventArgs e)
    {
        base.OnLoad(e);

        // 安装钩子
        _globalHook.InstallHook(GlobalHook.HookType.WH_MOUSE_LL);
        _globalHook.InstallHook(GlobalHook.HookType.WH_KEYBOARD_LL);
    }

    protected override void OnClosed(EventArgs e)
    {
        base.OnClosed(e);

        // 卸载钩子
        _globalHook.UninstallHook();
    }

    private void OnMouseEvent(object sender, MouseEventArgs e)
    {
        Console.WriteLine($"Mouse event: {e.Location}");
    }

    private void OnKeyEvent(object sender, KeyEventArgs e)
    {
        Console.WriteLine($"Key event: {e.KeyValue}");
    }
}

这样,你就可以在C#项目中使用全局钩子来监视和捕获系统范围内的键盘和鼠标事件了。请注意,全局钩子可能会影响系统性能,因此在不需要时,务必及时卸载钩子。

未经允许不得转载 » 本文链接:https://www.legongju.com/article/93452.html

相关推荐

  • 如何在C#项目中引入Lombok

    如何在C#项目中引入Lombok

    在C#项目中,我们不能直接使用Lombok,因为Lombok是Java项目的一个库,它可以帮助我们简化Java代码。但是,在C#中,我们有一些类似的库和方法可以帮助我们简化代...

  • Lombok在C#开发中的优势是什么

    Lombok在C#开发中的优势是什么

    Lombok是一个Java库,它通过注解自动生成Java代码,减少了开发人员的重复性工作。然而,Lombok并不是为C#设计的,因此Lombok在C#开发中并不具优势。以下是关于Lo...

  • C#中Lombok如何简化代码

    C#中Lombok如何简化代码

    在C#中,没有直接与Java的Lombok库相对应的库。Lombok是一个Java库,能够通过注解方式减少Java代码中的样板代码(例如getter、setter、toString等方法)。
    ...

  • C#中使用Lombok的安全性如何

    C#中使用Lombok的安全性如何

    Lombok是一个专门为Java设计的库,它通过注解的方式帮助开发者减少模板代码的编写,提高开发效率。然而,C#语言中并没有Lombok这样的库,因此Lombok不能直接在C#...

  • 如何编写高效的C#全局钩子代码

    如何编写高效的C#全局钩子代码

    在C#中,要编写高效的全局钩子代码,您需要使用Windows API函数SetWindowsHookEx 首先,引入所需的命名空间: using System;
    using System.Diagnostics;

  • C#全局钩子对系统性能有何影响

    C#全局钩子对系统性能有何影响

    C#全局钩子是一种在操作系统中设置的钩子,用于拦截和处理系统级别的事件,如键盘输入、鼠标移动等 系统资源消耗:全局钩子需要在操作系统中注册,这会增加系统资...

  • 在C#中全局钩子的安全性如何保证

    在C#中全局钩子的安全性如何保证

    在C#中,全局钩子(Global Hooks)是一种允许您监视和/或修改系统范围内的键盘和鼠标事件的技术 使用低级钩子(Low-Level Hooks):低级钩子可以捕获所有键盘和鼠...

  • C#全局钩子有哪些应用场景

    C#全局钩子有哪些应用场景

    C# 全局钩子(Global Hooks)是一种在操作系统中捕获和处理全局事件的技术。这些钩子可以用于监视和控制键盘、鼠标、系统消息等事件。以下是一些常见的 C# 全局钩...