Как правильно обрабатывать комбинации клавиш в хуке клавиатуры? - 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)