Использование оконных хуков намного чище, чем изменение реестра.Кроме того, иногда люди устанавливают собственные персонализированные карты скан-кодов, и их перезапись не очень приятная вещь.
Чтобы использовать функции подключения клавиш Windows, вам нужно DllImport пара функций winapi:
[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern IntPtr GetModuleHandle(string lpModuleName);
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern IntPtr SetWindowsHookEx(int idHook, HookHandlerDelegate lpfn, IntPtr hMod, uint dwThreadId);
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool UnhookWindowsHookEx(IntPtr hhk);
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam, ref KBDLLHOOKSTRUCT lParam);
[DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true, CallingConvention = CallingConvention.Winapi)]
public static extern short GetKeyState(int keyCode);
Довольно полное объяснение и пошаговое руководство можно найти на CodeProject .Вот прямая ссылка на автономный файл класса из этого примера, который делает все (чтобы заставить его скомпилироваться, если вы используете WPF, вам потребуется вручную ссылаться на dll System.Windows.Forms или просто изменитьссылка «System.Windows.Forms.Keys» на System.Windows.Input.Key должна работать).
Не забудьте вызвать UnhookWindowsHookEx () (класс делает это в Dispose ()), чтобы отцепить ваши снимки, или люди будут вас ненавидеть.