在C#中,你可以使用Windows API中的钩子函数来捕获键盘事件。下面是一个简单的示例代码,演示如何使用钩子来捕获键盘事件:

using System;
using System.Diagnostics;
using System.Runtime.InteropServices;

public class KeyboardHook
{
    private const int WH_KEYBOARD_LL = 13;
    private const int WM_KEYDOWN = 0x0100;
    private const int WM_SYSKEYDOWN = 0x0104;

    private static IntPtr hookId = IntPtr.Zero;
    private static LowLevelKeyboardProc keyboardProc = HookCallback;

    public static void Main()
    {
        hookId = SetHook(keyboardProc);
        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 || wParam == (IntPtr)WM_SYSKEYDOWN))
        {
            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);

    private enum Keys : int
    {
        A = 0x41,
        B = 0x42,
        C = 0x43,
        // Add more key codes as needed
    }
}

这段代码使用SetWindowsHookEx函数来设置键盘钩子,并指定了一个回调函数HookCallback来处理键盘事件。在回调函数中,我们可以通过Marshal.ReadInt32(lParam)来获取按下的键盘按键的虚拟键码(Virtual Key Code),然后将其转换为Keys枚举值。你可以根据需要添加更多的按键到Keys枚举中。

注意,这段代码需要在Windows操作系统上运行,并且需要管理员权限才能正常工作

C#钩子捕获键盘

原文地址: https://www.cveoy.top/t/topic/iCRl 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录