C#钩子捕获键盘
在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操作系统上运行,并且需要管理员权限才能正常工作
原文地址: https://www.cveoy.top/t/topic/iCRl 著作权归作者所有。请勿转载和采集!