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