From d66bdbb112217f3de88488d1ed7d469e34b23613 Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Mon, 24 Mar 2025 08:51:24 +0800 Subject: [PATCH] Force FL window foreground when switching keyboard layout --- Flow.Launcher.Infrastructure/Win32Helper.cs | 29 ++++++++++++++++----- 1 file changed, 22 insertions(+), 7 deletions(-) diff --git a/Flow.Launcher.Infrastructure/Win32Helper.cs b/Flow.Launcher.Infrastructure/Win32Helper.cs index 7a3a0c36e..a2d37a2f0 100644 --- a/Flow.Launcher.Infrastructure/Win32Helper.cs +++ b/Flow.Launcher.Infrastructure/Win32Helper.cs @@ -124,6 +124,16 @@ namespace Flow.Launcher.Infrastructure return PInvoke.SetForegroundWindow(new(handle)); } + public static bool IsForegroundWindow(Window window) + { + return GetWindowHandle(window).Equals(PInvoke.GetForegroundWindow()); + } + + internal static bool IsForegroundWindow(HWND handle) + { + return handle.Equals(PInvoke.GetForegroundWindow()); + } + #endregion #region Task Switching @@ -354,10 +364,17 @@ namespace Flow.Launcher.Infrastructure // No installed English layout found if (enHKL == HKL.Null) return; - // Get the current foreground window - var hwnd = PInvoke.GetForegroundWindow(); + // Get the FL main window + var hwnd = GetWindowHandle(Application.Current.MainWindow, true); if (hwnd == HWND.Null) return; + // Check if the FL main window is the current foreground window + if (!IsForegroundWindow(hwnd)) + { + var result = PInvoke.SetForegroundWindow(hwnd); + if (!result) throw new Win32Exception(Marshal.GetLastWin32Error()); + } + // Get the current foreground window thread ID var threadId = PInvoke.GetWindowThreadProcessId(hwnd); if (threadId == 0) throw new Win32Exception(Marshal.GetLastWin32Error()); @@ -367,12 +384,10 @@ namespace Flow.Launcher.Infrastructure // the IME mode instead of switching to another layout. var currentLayout = PInvoke.GetKeyboardLayout(threadId); var currentLangId = (uint)currentLayout.Value & KeyboardLayoutLoWord; - foreach (var langTag in ImeLanguageTags) + foreach (var imeLangTag in ImeLanguageTags) { - if (GetLanguageTag(currentLangId).StartsWith(langTag, StringComparison.OrdinalIgnoreCase)) - { - return; - } + var langTag = GetLanguageTag(currentLangId); + if (langTag.StartsWith(imeLangTag, StringComparison.OrdinalIgnoreCase)) return; } // Backup current keyboard layout