Beispiel #1
0
        internal void OnKeyboardInputReceived(object sender, Model.Input.KeyboardInput e)
        {
            Task.Factory.StartNew(delegate()
            {
                // translate input
                var client = GetClientByHandle(e.WindowHandle) ?? GetActiveClient();

                // dispatch to each extension
                _extensions.Values.ToList()
                .ForEach(ext =>
                {
                    try
                    {
                        var L_e = new Extensibility.Input.KeyboardEventArgs
                        {
                            Client  = client,
                            Handled = e.Handled,
                            CAS     = e.CAS,
                            VK      = (Mubox.WinAPI.VK)e.VK,
                            WM      = e.WM,
                        };
                        ext.Bridge.Keyboard.OnInputReceived(client, L_e);
                        e.Handled = e.Handled || L_e.Handled;
                    }
                    catch (Exception ex)
                    {
                        ex.Log();
                    }
                });
            }, TaskCreationOptions.PreferFairness);
        }
Beispiel #2
0
        private void OnKeyboardInputReceived(Model.Input.KeyboardInput keyboardInput)
        {
            //lock (_tiqLock)
            //{
            keyboardInput.Scan = (uint)WinAPI.SendInputApi.MapVirtualKey(keyboardInput.VK, WinAPI.SendInputApi.MAPVK.MAPVK_VK_TO_VSC);
            InputManager.Enqueue(keyboardInput);

            /* superceded by new 'KeyboardInputAdapter' (above)
             * IntPtr windowHandle = WindowHandle;
             *
             * // no target window
             * if (windowHandle == IntPtr.Zero)
             * {
             *  ("NoWindowHandle Failed OnKeyboardInputReceived, using SendInput for " + this.DisplayName).Log();
             *  WinAPI.SendInputApi.SendInputViaKBParams(keyboardInput.Flags, keyboardInput.Time, keyboardInput.Scan, keyboardInput.VK, keyboardInput.CAS);
             *  return;
             * }
             *
             * // no TIQ available
             * IntPtr windowInputQueue = WindowInputQueue;
             * if (windowInputQueue == IntPtr.Zero)
             * {
             *  ("NoWindowInputQueue Failed OnKeyboardInputReceived, using SendInput for " + this.DisplayName).Log();
             *  WinAPI.SendInputApi.SendInputViaKBParams(keyboardInput.Flags, keyboardInput.Time, keyboardInput.Scan, keyboardInput.VK, keyboardInput.CAS);
             *  return;
             * }
             *
             * // resolve TIQ
             * IntPtr foregroundWindowHandle;
             * IntPtr foregroundInputQueue;
             * if (!TryResolveTIQ(out foregroundInputQueue, out foregroundWindowHandle, DateTime.Now.AddMilliseconds(300).Ticks))
             * {
             *  ("TryResolveTIQ Failed OnKeyboardInputReceived, using SendInput for " + this.DisplayName).Log();
             *  WinAPI.SendInputApi.SendInputViaKBParams(keyboardInput.Flags, keyboardInput.Time, keyboardInput.Scan, keyboardInput.VK, keyboardInput.CAS);
             *  return;
             * }
             *
             * // use TIQ
             * Action action = () => OnKeyboardEventViaTIQ(keyboardInput.VK, keyboardInput.Flags, keyboardInput.Scan, keyboardInput.Time, keyboardInput.CAS);
             * ActionViaTIQ(action, foregroundInputQueue, "OnKeyboardInputReceived");
             */
            //}
        }
Beispiel #3
0
        private void OnKeyboardInputReceived(Model.Input.KeyboardInput keyboardInput)
        {
            // coerce specialized left/right shift-state to generalized shift-state
            switch ((Win32.VK)keyboardInput.VK)
            {
            case Win32.VK.LeftShift:
            case Win32.VK.RightShift:
                keyboardInput.VK = (uint)Win32.VK.Shift;
                break;

            case Win32.VK.LeftMenu:
            case Win32.VK.RightMenu:
                keyboardInput.VK = (uint)Win32.VK.Menu;
                break;

            case Win32.VK.LeftControl:
            case Win32.VK.RightControl:
                keyboardInput.VK = (uint)Win32.VK.Control;
                break;
            }

            // prevent windows key-repeat
            if (IsRepeatKey(keyboardInput.VK, keyboardInput.Scan, keyboardInput.Flags, keyboardInput.Time))
            {
                return;
            }

            // maintain MK state
            switch ((Win32.VK)keyboardInput.VK)
            {
            case Win32.VK.Control:
            case Win32.VK.LeftControl:
            case Win32.VK.RightControl:
                if ((keyboardInput.Flags & Win32.WindowHook.LLKHF.UP) == Win32.WindowHook.LLKHF.UP)
                {
                    CurrentMK = (CurrentMK | Win32.Windows.MK.MK_CONTROL) ^ Win32.Windows.MK.MK_CONTROL;
                }
                else
                {
                    CurrentMK |= Win32.Windows.MK.MK_CONTROL;
                }
                break;

            case Win32.VK.Shift:
            case Win32.VK.LeftShift:
            case Win32.VK.RightShift:
                if ((keyboardInput.Flags & Win32.WindowHook.LLKHF.UP) == Win32.WindowHook.LLKHF.UP)
                {
                    CurrentMK = (CurrentMK | Win32.Windows.MK.MK_SHIFT) ^ Win32.Windows.MK.MK_SHIFT;
                }
                else
                {
                    CurrentMK |= Win32.Windows.MK.MK_CONTROL;
                }
                break;
            }

            IntPtr windowHandle = WindowHandle;

            // no target window
            if (windowHandle == IntPtr.Zero)
            {
                Debug.WriteLine("NoWindowHandle Failed OnKeyboardInputReceived, using SendInput for " + this.DisplayName);
                Win32.SendInputApi.SendInputViaKBParams(keyboardInput.Flags, keyboardInput.Time, keyboardInput.Scan, keyboardInput.VK, keyboardInput.CAS);
                return;
            }

            // no VIQ available
            IntPtr windowInputQueue = WindowInputQueue;

            if (windowInputQueue == IntPtr.Zero)
            {
                Debug.WriteLine("NoWindowInputQueue Failed OnKeyboardInputReceived, using SendInput for " + this.DisplayName);
                Win32.SendInputApi.SendInputViaKBParams(keyboardInput.Flags, keyboardInput.Time, keyboardInput.Scan, keyboardInput.VK, keyboardInput.CAS);
                return;
            }

            // resolve VIQ
            IntPtr foregroundWindowHandle;
            IntPtr foregroundInputQueue;

            if (!TryResolveViq(out foregroundInputQueue, out foregroundWindowHandle, DateTime.Now.AddMilliseconds(1000).Ticks))
            {
                Debug.WriteLine("TryResolveVIQ Failed OnKeyboardInputReceived, using SendInput for " + this.DisplayName);
                Win32.SendInputApi.SendInputViaKBParams(keyboardInput.Flags, keyboardInput.Time, keyboardInput.Scan, keyboardInput.VK, keyboardInput.CAS);
                return;
            }

            // use VIQ
            Action action = () => OnKeyboardEventViaViq(keyboardInput.VK, keyboardInput.Flags, keyboardInput.Scan, keyboardInput.Time, keyboardInput.CAS);

            ActionViaViq(action, foregroundInputQueue, "OnKeyboardInputReceived");
        }