Пример #1
0
        public IntPtr LowLevelKeyboardProc(int nCode, IntPtr wParam, IntPtr lParam)
        {
            bool fEatKeyStroke = false;

            var wparamTyped = wParam.ToInt32();

            if (Enum.IsDefined(typeof(Native.KeyboardState), wparamTyped))
            {
                object o = Marshal.PtrToStructure(lParam, typeof(LowLevelKeyboardInputEvent));
                LowLevelKeyboardInputEvent p = (LowLevelKeyboardInputEvent)o;

                var eventArguments = new KeyboardHookEventArgs(p, (Native.KeyboardState)wparamTyped);

                var scancode = eventArguments.KeyboardData.HardwareScanCode;
                var vkey     = (VirtualKeys)eventArguments.KeyboardData.VirtualCode;

                var flags    = eventArguments.KeyboardData.Flags;
                var extended = ((flags) & ((int)KeyFlags.KF_EXTENDED >> 8)) > 0;

                var altdown  = ((flags) & ((int)KeyFlags.KF_ALTDOWN >> 8)) > 0;
                var dlgmode  = ((flags) & ((int)KeyFlags.KF_DLGMODE >> 8)) > 0;
                var menumode = ((flags) & ((int)KeyFlags.KF_MENUMODE >> 8)) > 0;
                var repeat   = ((flags) & ((int)KeyFlags.KF_REPEAT >> 8)) > 0;
                var up       = ((flags) & ((int)KeyFlags.KF_UP >> 8)) > 0;


                //TODO: why is this code ignoring virtual keys and mapping it custom?
                //TODO: figure out what extended 2 is supposed to do from the raw input opentk code....
                var is_valid = true;
                Key key      = WinKeyMap.TranslateKey(scancode, vkey, extended, false, out is_valid);



                if (is_valid)
                {
                    if (eventArguments.KeyboardState == Native.KeyboardState.KeyDown || eventArguments.KeyboardState == Native.KeyboardState.SysKeyDown)
                    {
                        OnKeyDown(key);
                        fEatKeyStroke = KeyDownArgs.Handled;
                    }
                    if (eventArguments.KeyboardState == Native.KeyboardState.KeyUp || eventArguments.KeyboardState == Native.KeyboardState.SysKeyUp)
                    {
                        OnKeyUp(key);
                        fEatKeyStroke = KeyUpArgs.Handled;
                    }
                }
            }

            return(fEatKeyStroke ? (IntPtr)1 : NativeMethods.CallNextHookEx(IntPtr.Zero, nCode, wParam, lParam));
        }
Пример #2
0
        public override void SendKeyUp(Key key)
        {
            bool keyup   = true;
            bool altDown = KeyboardState.IsKeyDown(Key.AltLeft) || KeyboardState.IsKeyDown(Key.AltRight);

            WinKeyMap.ReverseTranslateKey(key, keyup, altDown, out int tscancode, out VirtualKeys tvk, out _, out bool extended);

            // bool sysKey = (!altDown && key == Key.AltLeft) || (!altDown && key == Key.AltRight) || ((key != Key.AltLeft && key != Key.AltRight && altDown));

            int dwFlags = 0x0008 | 0x0002;

            if (extended)
            {
                dwFlags |= 0x0001;
            }


            KeyboardState.SetKeyState(key, false);

            //var altdown = ((tflags) & ((int)KeyFlags.KF_ALTDOWN >> 8)) > 0;
            //var dlgmode = ((tflags) & ((int)KeyFlags.KF_DLGMODE >> 8)) > 0;
            //var menumode = ((tflags) & ((int)KeyFlags.KF_MENUMODE >> 8)) > 0;
            //var repeat = ((tflags) & ((int)KeyFlags.KF_REPEAT >> 8)) > 0;
            //var up = ((tflags) & ((int)KeyFlags.KF_UP >> 8)) > 0;



            NativeMethods.INPUT[] inputs;
            if (extended)
            {
                inputs = new[]
                {
                    new NativeMethods.INPUT
                    {
                        type = NativeMethods.INPUT_KEYBOARD,

                        u = new NativeMethods.InputUnion
                        {
                            ki = new NativeMethods.KEYBDINPUT()
                            {
                                wScan       = 0xe0,
                                wVk         = 0,
                                dwFlags     = 0,
                                dwExtraInfo = NativeMethods.GetMessageExtraInfo()
                            }
                        }
                    },
                    new NativeMethods.INPUT
                    {
                        type = NativeMethods.INPUT_KEYBOARD,

                        u = new NativeMethods.InputUnion
                        {
                            ki = new NativeMethods.KEYBDINPUT()
                            {
                                wScan       = (ushort)tscancode,
                                wVk         = (ushort)tvk,
                                dwFlags     = (ushort)dwFlags,
                                dwExtraInfo = NativeMethods.GetMessageExtraInfo()
                            }
                        }
                    }
                };
            }
            else
            {
                inputs = new[]
                {
                    new NativeMethods.INPUT
                    {
                        type = NativeMethods.INPUT_KEYBOARD,

                        u = new NativeMethods.InputUnion
                        {
                            ki = new NativeMethods.KEYBDINPUT()
                            {
                                wScan       = (ushort)tscancode,
                                wVk         = (ushort)tvk,
                                dwFlags     = (ushort)dwFlags,
                                dwExtraInfo = NativeMethods.GetMessageExtraInfo()
                            }
                        }
                    }
                };
            }

            NativeMethods.SendInput((uint)inputs.Length, inputs, Marshal.SizeOf(typeof(NativeMethods.INPUT)));
        }