.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);
        }
    }
Использую этот хук, но он работает только с одной кнопкой, а мне нужно 2
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)))
...
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

10   голосов , оценка 4.2 из 5
Похожие ответы