Force FL window foreground when switching keyboard layout

This commit is contained in:
Jack251970 2025-03-24 08:51:24 +08:00
parent ddec1bd626
commit d66bdbb112

View file

@ -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