diff --git a/src/Avalonia.Base/Input/MouseDevice.cs b/src/Avalonia.Base/Input/MouseDevice.cs index fc60551606..b09f195656 100644 --- a/src/Avalonia.Base/Input/MouseDevice.cs +++ b/src/Avalonia.Base/Input/MouseDevice.cs @@ -104,6 +104,9 @@ namespace Avalonia.Input case RawPointerEventType.Swipe: e.Handled = GestureSwipe(mouse, e.Timestamp, e.Root, e.Position, props, ((RawPointerGestureEventArgs)e).Delta, keyModifiers, e.InputHitTestResult.firstEnabledAncestor); break; + case RawPointerEventType.CancelCapture: + PlatformCaptureLost(); + break; } } @@ -308,7 +311,7 @@ namespace Avalonia.Input internal void PlatformCaptureLost() { - _pointer.Capture(null); + _pointer.PlatformCaptureLost(); } } } diff --git a/src/Avalonia.Base/Input/Pointer.cs b/src/Avalonia.Base/Input/Pointer.cs index 43692da296..7b98d6e3df 100644 --- a/src/Avalonia.Base/Input/Pointer.cs +++ b/src/Avalonia.Base/Input/Pointer.cs @@ -32,14 +32,28 @@ namespace Avalonia.Input { } - + + internal void PlatformCaptureLost() + { + if (Captured != null) + Capture(null, platformInitiated: true); + } + public void Capture(IInputElement? control) + { + Capture(control, platformInitiated: false); + } + + private void Capture(IInputElement? control, bool platformInitiated) { if (Captured is Visual v1) v1.DetachedFromVisualTree -= OnCaptureDetached; var oldCapture = Captured; Captured = control; - PlatformCapture(control); + + if (!platformInitiated) + PlatformCapture(control); + if (oldCapture is Visual v2) { var commonParent = FindCommonParent(control, oldCapture); diff --git a/src/Avalonia.Base/Input/Raw/RawPointerEventArgs.cs b/src/Avalonia.Base/Input/Raw/RawPointerEventArgs.cs index 1d5d0a7822..5261086cc5 100644 --- a/src/Avalonia.Base/Input/Raw/RawPointerEventArgs.cs +++ b/src/Avalonia.Base/Input/Raw/RawPointerEventArgs.cs @@ -26,7 +26,8 @@ namespace Avalonia.Input.Raw TouchCancel, Magnify, Rotate, - Swipe + Swipe, + CancelCapture } /// diff --git a/src/Windows/Avalonia.Win32/WindowImpl.AppWndProc.cs b/src/Windows/Avalonia.Win32/WindowImpl.AppWndProc.cs index 5c5a77ae9a..0f79a26ece 100644 --- a/src/Windows/Avalonia.Win32/WindowImpl.AppWndProc.cs +++ b/src/Windows/Avalonia.Win32/WindowImpl.AppWndProc.cs @@ -394,6 +394,26 @@ namespace Avalonia.Win32 break; } + case WindowsMessage.WM_CAPTURECHANGED: + { + if (IsMouseInPointerEnabled) + { + break; + } + if (_hwnd != lParam) + { + _trackingMouse = false; + e = new RawPointerEventArgs( + _mouseDevice, + timestamp, + Owner, + RawPointerEventType.CancelCapture, + new Point(-1, -1), + WindowsKeyboardDevice.Instance.Modifiers); + } + break; + } + case WindowsMessage.WM_NCLBUTTONDOWN: case WindowsMessage.WM_NCRBUTTONDOWN: case WindowsMessage.WM_NCMBUTTONDOWN: