📜  键盘挂钩 c# (1)

📅  最后修改于: 2023-12-03 15:42:09.730000             🧑  作者: Mango

键盘挂钩 C# - 让你的程序监听键盘按键事件

当你需要让你的程序监听键盘按键事件时,你可以使用 C# 中的 键盘挂钩 (Keyboard Hook)来实现这个功能。

什么是键盘挂钩

键盘挂钩是一种机制,它允许你在操作系统接收键盘事件之前捕获这些事件并对它们进行处理。这样可以让你的程序监听键盘输入并采取一些特定的动作。

使用键盘挂钩你可以:

  • 监听全局的键盘事件,包括键盘按下、键盘弹起、组合键等。
  • 截获特定的键盘事件,例如阻止系统默认的热键。
  • 模拟键盘事件,例如模拟键盘按键、设置键盘状态等。
如何使用键盘挂钩

在 C# 中,你可以使用 System.Windows.Forms 命名空间中的 KeyboardHook 类来实现键盘挂钩。下面是一个简单的示例代码:

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

public class KeyboardHook
{
    private const int WH_KEYBOARD_LL = 13;
    private const int WM_KEYDOWN = 0x0100;
    private const int WM_KEYUP = 0x0101;
    private static LowLevelKeyboardProc _proc = HookCallback;
    private static IntPtr _hookID = IntPtr.Zero;

    public static void Main()
    {
        _hookID = SetHook(_proc);
        Application.Run();
        UnhookWindowsHookEx(_hookID);
    }

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

    private delegate IntPtr LowLevelKeyboardProc(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);
    }

    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    private static extern IntPtr SetWindowsHookEx(int idHook, LowLevelKeyboardProc 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);
}

这个代码演示了如何监听全局的键盘按键事件,并将按下的按键信息输出到控制台。你可以根据需要修改代码以适应自己的应用场景。

最后

这里介绍的是在 C# 中使用 System.Windows.Forms 命名空间中的 KeyboardHook 类实现键盘挂钩的方法。当然,你也可以使用其他一些库来实现这个功能。但需要注意的是,为了保证安全,操作系统通常会禁止对全局键盘事件进行监听,因此使用键盘挂钩时需要获取管理员权限。