Как правильно обрабатывать комбинации клавиш в хуке клавиатуры? - C#

Узнай цену своей работы

Формулировка задачи:

Подскажите пожалуйста как правильно реализовать структуру для хуков на комбинации Alt+Tab,Alt+Space,Ctrl+Alt+Delete и другие.
 public IntPtr LowLevelKeyboardHookProc_space(int nCode, IntPtr wParam, IntPtr lParam)
        {
            if (nCode >= 0)
            {
 
                KBDLLHOOKSTRUCT objKeyInfo =
                 (KBDLLHOOKSTRUCT)System.Runtime.InteropServices.Marshal.PtrToStructure(lParam, typeof(KBDLLHOOKSTRUCT));
                Console.WriteLine("VirtualKeyCode {0},ScanCode {1},Flags {2},Time {3},ExtraInfo {4}, wParam {5}, ???{6},{7}", objKeyInfo.VirtualKeyCode, objKeyInfo.ScanCode, objKeyInfo.Flags, objKeyInfo.Time, objKeyInfo.ExtraInfo, wParam.ToInt32(), lParam.ToInt32() >> 31, (Keys)wParam.ToInt32());
                //if (objKeyInfo.VirtualKeyCode == 164 && wParam.ToInt32() == 260 && objKeyInfo.ScanCode == 56)
                //{
                //    MessageBox.Show("Alt+Space");
                //    return (IntPtr)1; 
                //}
                if (objKeyInfo.VirtualKeyCode == 9 && wParam.ToInt32() == 257 && objKeyInfo.ScanCode == 15 && objKeyInfo.Flags==0)
                {
                    MessageBox.Show("Alt+Tab");
                    return (IntPtr)1;//<Alt> 
                }
            }
            return CallNextHookEx(m_hHook_3, nCode, wParam, lParam);
        } 
[System.Runtime.InteropServices.StructLayout(System.Runtime.InteropServices.LayoutKind.Sequential)]
        private struct KBDLLHOOKSTRUCT //Какую тут реализовывать чтоб оно отлавливало 2 клавиши или три? 
        {
            public readonly int VirtualKeyCode;
            public readonly int ScanCode;
            public readonly int Flags;
            public readonly int Time;
            public readonly IntPtr ExtraInfo;
        }
 
        //Using callbacks
 
        private LowLevelKeyboardProcDelegate m_callback_3;

        //переменные для разблокировки клавиатуры
        private IntPtr m_hHook;
        private IntPtr m_hHook_3;
 
        //Установка перехвата клавиатуры
        [System.Runtime.InteropServices.DllImport("user32.dll", SetLastError = true)]
        private static extern IntPtr SetWindowsHookEx(int idHook, LowLevelKeyboardProcDelegate lpfn, IntPtr hMod, int dwThreadId);
 
        //Разблокировка клавиатуры
        [System.Runtime.InteropServices.DllImport("user32.dll", SetLastError = true)]
        private static extern bool UnhookWindowsHookEx(IntPtr hhk);
 
        //Hook handle
        [System.Runtime.InteropServices.DllImport("Kernel32.dll", SetLastError = true)]
        private static extern IntPtr GetModuleHandle(IntPtr lpModuleName);
 
        //Вызов следующего хука
        [System.Runtime.InteropServices.DllImport("user32.dll", SetLastError = true)]
        private static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam, IntPtr lParam);
Я думал может реализовать очередь и записывать туда кнопки? Заранее спасибо.

Решение задачи: «Как правильно обрабатывать комбинации клавиш в хуке клавиатуры?»

textual
Листинг программы
if ((Keyboard.Modifiers & ModifierKeys.Shift) != 0)

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


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

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

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