Как правильно обрабатывать комбинации клавиш в хуке клавиатуры? - 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)
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д