diff --git a/src/Windows/Avalonia.Win32/WindowImpl.AppWndProc.cs b/src/Windows/Avalonia.Win32/WindowImpl.AppWndProc.cs index 35b823d34c0..29d4a614dea 100644 --- a/src/Windows/Avalonia.Win32/WindowImpl.AppWndProc.cs +++ b/src/Windows/Avalonia.Win32/WindowImpl.AppWndProc.cs @@ -19,6 +19,8 @@ namespace Avalonia.Win32 { internal partial class WindowImpl { + private bool _killFocusRequested; + [SuppressMessage("Microsoft.StyleCop.CSharp.NamingRules", "SA1305:FieldNamesMustNotUseHungarianNotation", Justification = "Using Win32 naming for consistency.")] [UnconditionalSuppressMessage("Trimming", "IL2026", Justification = "We do .NET COM interop availability checks")] @@ -718,7 +720,15 @@ protected virtual unsafe IntPtr AppWndProc(IntPtr hWnd, uint msg, IntPtr wParam, } case WindowsMessage.WM_KILLFOCUS: - LostFocus?.Invoke(); + if (Imm32InputMethod.Current.IsComposing) + { + _killFocusRequested = true; + } + else + { + LostFocus?.Invoke(); + } + break; case WindowsMessage.WM_INPUTLANGCHANGE: @@ -763,6 +773,13 @@ protected virtual unsafe IntPtr AppWndProc(IntPtr hWnd, uint msg, IntPtr wParam, { Imm32InputMethod.Current.HandleCompositionEnd(timestamp); + if (_killFocusRequested) + { + LostFocus?.Invoke(); + + _killFocusRequested = false; + } + return IntPtr.Zero; } case WindowsMessage.WM_GETOBJECT: