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); }
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"); */ //} }
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"); }