Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 25 additions & 7 deletions Flow.Launcher.Infrastructure/Win32Helper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -124,6 +124,16 @@ public static bool SetForegroundWindow(nint handle)
return PInvoke.SetForegroundWindow(new(handle));
}

public static bool IsForegroundWindow(Window window)
{
return IsForegroundWindow(GetWindowHandle(window));
}

internal static bool IsForegroundWindow(HWND handle)
{
return handle.Equals(PInvoke.GetForegroundWindow());
}

#endregion

#region Task Switching
Expand Down Expand Up @@ -354,10 +364,20 @@ public static unsafe void SwitchToEnglishKeyboardLayout(bool backupPrevious)
// No installed English layout found
if (enHKL == HKL.Null) return;

// Get the current foreground window
var hwnd = PInvoke.GetForegroundWindow();
// When application is exiting, the Application.Current will be null
if (Application.Current == null) return;

// 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());
Expand All @@ -367,12 +387,10 @@ public static unsafe void SwitchToEnglishKeyboardLayout(bool backupPrevious)
// 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
Expand Down
Loading