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()