Beispiel #1
0
        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;
                }
            }
        }
Beispiel #2
0
        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));
        }