diff --git a/Flow.Launcher/Flow.Launcher.csproj b/Flow.Launcher/Flow.Launcher.csproj index f431504c2e4..9d40427005a 100644 --- a/Flow.Launcher/Flow.Launcher.csproj +++ b/Flow.Launcher/Flow.Launcher.csproj @@ -77,6 +77,24 @@ Designer PreserveNewest + + 1 + 1 + eab22ac0-30c1-11cf-a7eb-0000c05bae0b + 0 + tlbimp + false + true + + + 0 + 1 + 50a7e9b0-70ef-11d1-b75a-00a0c90564fe + 0 + tlbimp + false + true + PreserveNewest diff --git a/Flow.Launcher/ViewModel/MainViewModel.cs b/Flow.Launcher/ViewModel/MainViewModel.cs index abf3a1d14ea..412af09fdfd 100644 --- a/Flow.Launcher/ViewModel/MainViewModel.cs +++ b/Flow.Launcher/ViewModel/MainViewModel.cs @@ -20,7 +20,9 @@ using Microsoft.VisualStudio.Threading; using System.Threading.Channels; using ISavable = Flow.Launcher.Plugin.ISavable; - +using System.Runtime.InteropServices; +using System.Text; +using SHDocVw; namespace Flow.Launcher.ViewModel { @@ -720,6 +722,68 @@ private void SetOpenResultModifiers() OpenResultCommandModifiers = _settings.OpenResultModifiers ?? DefaultOpenResultModifiers; } + private static string GetActiveExplorerPath() + { + // get the active window + IntPtr handle = GetForegroundWindow(); + + // Required ref: SHDocVw (Microsoft Internet Controls COM Object) - C:\Windows\system32\ShDocVw.dll + ShellWindows shellWindows = new SHDocVw.ShellWindows(); + + // loop through all windows + foreach (var window in shellWindows) + { + if (window is not SHDocVw.InternetExplorer) + { + continue; + } + + var explorerWindow = (SHDocVw.InternetExplorer)window; + // match active window + if (explorerWindow.HWND == (int)handle) + { + // Required ref: Shell32 - C:\Windows\system32\Shell32.dll + var shellWindow = explorerWindow.Document as Shell32.IShellFolderViewDual2; + + // will be null if you are in Internet Explorer for example + if (shellWindow != null) + { + // Item without an index returns the current object + var currentFolder = shellWindow.Folder.Items().Item(); + + // special folder - use window title + // for some reason on "Desktop" gives null + if (currentFolder == null || currentFolder.Path.StartsWith("::")) + { + // Get window title instead + const int nChars = 256; + StringBuilder Buff = new StringBuilder(nChars); + if (GetWindowText(handle, Buff, nChars) > 0) + { + return Buff.ToString(); + } + } + else + { + return currentFolder.Path; + } + } + + break; + } + } + + return null; + } + + // COM Imports + + [DllImport("user32.dll")] + private static extern IntPtr GetForegroundWindow(); + + [DllImport("user32.dll")] + static extern int GetWindowText(IntPtr hWnd, StringBuilder text, int count); + public void ToggleFlowLauncher() { if (!MainWindowVisibilityStatus) @@ -734,6 +798,9 @@ public void ToggleFlowLauncher() public void Show() { + string _explorerPath = GetActiveExplorerPath(); + + if (_settings.UseSound) { MediaPlayer media = new MediaPlayer(); @@ -749,6 +816,11 @@ public void Show() ((MainWindow)Application.Current.MainWindow).WindowAnimator(); MainWindowOpacity = 1; + if (_explorerPath != null && _explorerPath != "File Explorer") + { + ChangeQueryText($"{_explorerPath}\\>"); + } + } public async void Hide()