.NET 4.x Хук нескольких клавиш - C#
Формулировка задачи:
public class Hook : IDisposable { #region Declare WinAPI functions [DllImport("kernel32.dll")] private static extern IntPtr LoadLibrary(string lpFileName); [DllImport("user32.dll")] private static extern IntPtr SetWindowsHookEx(int idHook, KeyboardHookProc callback, IntPtr hInstance, uint threadId); [DllImport("user32.dll")] private static extern IntPtr CallNextHookEx(IntPtr idHook, int nCode, int wParam, IntPtr lParam); [DllImport("user32.dll")] private static extern bool UnhookWindowsHookEx(IntPtr hInstance); #endregion #region Constants private const int WH_KEYBOARD_LL = 13; private const int WH_KEYDOWN = 0x0100; #endregion // код клавиши на которую ставим хук private int _key; public event KeyPressEventHandler KeyPressed; private delegate IntPtr KeyboardHookProc(int code, IntPtr wParam, IntPtr lParam); private KeyboardHookProc _proc; private IntPtr _hHook = IntPtr.Zero; public Hook(int keyCode) { _key = keyCode; _proc = HookProc; } public void SetHook() { var hInstance = LoadLibrary("User32"); _hHook = SetWindowsHookEx(WH_KEYBOARD_LL, _proc, hInstance, 0); } public void Dispose() { UnHook(); } public void UnHook() { UnhookWindowsHookEx(_hHook); } private IntPtr HookProc(int code, IntPtr wParam, IntPtr lParam) { if ((code >= 0 && wParam == (IntPtr)WH_KEYDOWN) && Marshal.ReadInt32(lParam) == _key) { // бросаем событие if (KeyPressed != null) { KeyPressed(this, new KeyPressEventArgs(Convert.ToChar(code))); } } // пробрасываем хук дальше return CallNextHookEx(_hHook, code, (int)wParam, lParam); } }
void _hook_KeyPressed(object sender, KeyPressEventArgs e) //Событие нажатия клавиш { } public Form1() { InitializeComponent(); _hook = new Hook(0x31); // 1 кнопка _hook = new Hook(0x32); // 2 кнопка _hook.KeyPressed += new KeyPressEventHandler(_hook_KeyPressed); _hook.SetHook(); }
Решение задачи: «.NET 4.x Хук нескольких клавиш»
textual
Листинг программы
List<int> keys = new List<int(); ... public void AddKey(int key) { keys.Add(key); } ... private IntPtr HookProc(int code, IntPtr wParam, IntPtr lParam) { ... if ((code >= 0 && wParam == (IntPtr)WH_KEYDOWN) && keys.Contains(Marshal.ReadInt32(lParam))) ... }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д