diff --git a/Perspex.Input/InputElement.cs b/Perspex.Input/InputElement.cs index 6c5b3a7bb6..c52addf8b2 100644 --- a/Perspex.Input/InputElement.cs +++ b/Perspex.Input/InputElement.cs @@ -46,6 +46,11 @@ namespace Perspex.Input "KeyDown", RoutingStrategies.Tunnel | RoutingStrategies.Bubble); + public static readonly RoutedEvent KeyUpEvent = + RoutedEvent.Register( + "KeyUp", + RoutingStrategies.Tunnel | RoutingStrategies.Bubble); + public static readonly RoutedEvent PointerEnterEvent = RoutedEvent.Register("PointerEnter", RoutingStrategies.Direct); @@ -79,6 +84,7 @@ namespace Perspex.Input GotFocusEvent.AddClassHandler(x => x.OnGotFocus); LostFocusEvent.AddClassHandler(x => x.OnLostFocus); KeyDownEvent.AddClassHandler(x => x.OnKeyDown); + KeyDownEvent.AddClassHandler(x => x.OnKeyUp); PointerEnterEvent.AddClassHandler(x => x.OnPointerEnter); PointerLeaveEvent.AddClassHandler(x => x.OnPointerLeave); PointerMovedEvent.AddClassHandler(x => x.OnPointerMoved); @@ -105,6 +111,12 @@ namespace Perspex.Input remove { this.RemoveHandler(KeyDownEvent, value); } } + public event EventHandler KeyUp + { + add { this.AddHandler(KeyUpEvent, value); } + remove { this.RemoveHandler(KeyUpEvent, value); } + } + public event EventHandler PointerEnter { add { this.AddHandler(PointerEnterEvent, value); } @@ -243,6 +255,10 @@ namespace Perspex.Input } } + protected virtual void OnKeyUp(KeyEventArgs e) + { + } + protected virtual void OnPointerEnter(PointerEventArgs e) { this.IsPointerOver = true; diff --git a/Perspex.Input/KeyboardDevice.cs b/Perspex.Input/KeyboardDevice.cs index e31172507d..743d26ea34 100644 --- a/Perspex.Input/KeyboardDevice.cs +++ b/Perspex.Input/KeyboardDevice.cs @@ -83,9 +83,13 @@ namespace Perspex.Input switch (e.Type) { case RawKeyEventType.KeyDown: + case RawKeyEventType.KeyUp: + var routedEvent = e.Type == RawKeyEventType.KeyDown ? + InputElement.KeyDownEvent : InputElement.KeyUpEvent; + KeyEventArgs ev = new KeyEventArgs { - RoutedEvent = InputElement.KeyDownEvent, + RoutedEvent = routedEvent, Device = this, Key = e.Key, Text = e.Text, diff --git a/Windows/Perspex.Win32/WindowImpl.cs b/Windows/Perspex.Win32/WindowImpl.cs index 49be891847..17a6b95c78 100644 --- a/Windows/Perspex.Win32/WindowImpl.cs +++ b/Windows/Perspex.Win32/WindowImpl.cs @@ -256,6 +256,17 @@ namespace Perspex.Win32 WindowsKeyboardDevice.Instance.StringFromVirtualKey((uint)wParam)); break; + case UnmanagedMethods.WindowsMessage.WM_KEYUP: + case UnmanagedMethods.WindowsMessage.WM_SYSKEYUP: + WindowsKeyboardDevice.Instance.UpdateKeyStates(); + e = new RawKeyEventArgs( + WindowsKeyboardDevice.Instance, + timestamp, + RawKeyEventType.KeyUp, + KeyInterop.KeyFromVirtualKey((int)wParam), + WindowsKeyboardDevice.Instance.StringFromVirtualKey((uint)wParam)); + break; + case UnmanagedMethods.WindowsMessage.WM_LBUTTONDOWN: e = new RawMouseEventArgs( WindowsMouseDevice.Instance,