Если вы хотите полный хук клавиатуры, будет более интересно использовать эти функции:
public class WindowsHookAPI
{
//public delegate IntPtr HookDelegate(
// Int32 Code, IntPtr wParam, IntPtr lParam);
public delegate IntPtr HookDelegate(Int32 Code, IntPtr wParam, IntPtr lParam);
[DllImport("User32.dll")]
public static extern IntPtr CallNextHookEx(IntPtr hHook, Int32 nCode, IntPtr wParam, IntPtr lParam);
[DllImport("User32.dll")]
public static extern IntPtr UnhookWindowsHookEx(IntPtr hHook);
[DllImport("User32.dll")]
public static extern IntPtr SetWindowsHookEx(Int32 idHook, HookDelegate lpfn, IntPtr hmod, Int32 dwThreadId);
}
вы наверняка перехватите все клавиши, и вы можете легко заблокировать некоторые клавиши, если хотите ..
«это источник хука»
вы устанавливаете глобальный хук следующим образом:
keyBoardHandle = WindowsHookAPI.SetWindowsHookEx(WH_KEYBOARD_LL, keyBoardDelegate, IntPtr.Zero, 0);
и пример для его использования:
private WindowsHookAPI.HookDelegate keyBoardDelegate;
private IntPtr keyBoardHandle;
// Hook global keyboard
private const Int32 WH_KEYBOARD_LL = 13;
// flags bits of lParam hookstruct
private const Int32 LLKHF_EXTENDED = 0b00000001;
private const Int32 LLKHF_LOWER_IL_INJECTED = 0b00000010;
private const Int32 LLKHF_INJECTED = 0b00010000;
private const Int32 LLKHF_ALTDOWN = 0b00100000;
private const Int32 LLKHF_UP = 0b10000000;
// value of wParam
private const Int32 WM_KEYUP = 0x0101;
private const Int32 WM_KEYDOWN = 0x0100;
private IntPtr KeyboardHookDelegate(Int32 Code, IntPtr wParam, IntPtr lParam)
{
hookStruct param = (hookStruct)Marshal.PtrToStructure(lParam, typeof(hookStruct));
if (Code < 0 || (param.flags & LLKHF_INJECTED) != 0)
{
return WindowsHookAPI.CallNextHookEx(keyBoardHandle, Code, wParam, lParam);
}
if ((int)wParam == WM_KEYDOWN)
{
// see https://docs.microsoft.com/en-us/windows/desktop/api/winuser/ns-winuser-tagkbdllhookstruct
// for more explanations about type of keys trapped
// return (IntPtr)1; // if you want to block some keys
}
return WindowsHookAPI.CallNextHookEx(keyBoardHandle, Code, wParam, lParam);
}
public struct hookStruct
{
public int vkCode;
public int scanCode;
public int flags;
public int time;
public int dwExtraInfo;
}
отцепить использовать:
WindowsHookAPI.UnhookWindowsHookEx(keyBoardHandle);