private void HookEx_Events(object sender, WindowsHookExEventArgs e) { if (KeyChange == null) { return; } KeyboardLLHookStruct @struct = (KeyboardLLHookStruct)Marshal.PtrToStructure((IntPtr)e.lParam, typeof(KeyboardLLHookStruct)); PressType pressType = PressType.None; VirtualKeys vk = (VirtualKeys)@struct.VirtualKeyCode; KeyboardState state = KeyboardState.FromCurrentState(); char?inputChar = null; if (e.wParam.ToInt64() == WM.KEYDOWN || e.wParam.ToInt64() == WM.SYSKEYDOWN) { pressType = PressType.KeyDown; } else if (e.wParam.ToInt64() == WM.KEYUP || e.wParam.ToInt64() == WM.SYSKEYUP) { pressType = PressType.KeyUp; } // Get Press Char char?PressKey = null; byte[] inBuffer = new byte[2]; if (User32.ToAscii(@struct.VirtualKeyCode, @struct.ScanCode, state.Bytes, inBuffer, @struct.Flags) == 1) { char ch = (char)inBuffer[0]; if (!char.IsControl(ch)) { PressKey = ch; if ((state.CapsLockToggled ^ state.ShiftPressed) && char.IsLetter(ch)) { PressKey = char.ToUpper(ch); } inputChar = PressKey; } } var args = new KeyChangeEventArgs() { Handled = false, PressType = pressType, Key = vk, KeyboardState = state, InputChar = inputChar, }; foreach (var action in KeyChange.GetInvocationList().Reverse()) { action.DynamicInvoke(this, args); if (args.Handled) { e.Handled = true; return; } } }
private int HookProc(int code, IntPtr wParam, ref KeyboardLLHookStruct lParam) { if (code == HC_ACTION) { if (wParam.ToInt32() == WM_KEYDOWN || wParam.ToInt32() == WM_SYSKEYDOWN) { foreach (var item in _menuItems) { var key1 = true; var key2 = true; if (item.Key1 != VirtualKeyModifier.None) { var key1State = GetAsyncKeyState((int)item.Key1) & 0x8000; key1 = Convert.ToBoolean(key1State); } if (item.Key2 != VirtualKeyModifier.None) { var key2State = GetAsyncKeyState((int)item.Key2) & 0x8000; key2 = Convert.ToBoolean(key2State); } if (key1 && key2 && lParam.vkCode == (int)item.Key3) { var handler = Hooked; if (handler != null) { var menuItemId = MenuItemId.GetId(item.Name); var eventArgs = new HotKeyEventArgs(menuItemId); handler.BeginInvoke(this, eventArgs, null, null); break; } } } } } return(CallNextHookEx(_hookHandle, code, wParam, ref lParam)); }