Skip to content
Merged
Show file tree
Hide file tree
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
18 changes: 18 additions & 0 deletions Flow.Launcher/Flow.Launcher.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,24 @@
<SubType>Designer</SubType>
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<COMReference Include="SHDocVw">
<VersionMinor>1</VersionMinor>
<VersionMajor>1</VersionMajor>
<Guid>eab22ac0-30c1-11cf-a7eb-0000c05bae0b</Guid>
<Lcid>0</Lcid>
<WrapperTool>tlbimp</WrapperTool>
<Isolated>false</Isolated>
<EmbedInteropTypes>true</EmbedInteropTypes>
</COMReference>
<COMReference Include="Shell32">
<VersionMinor>0</VersionMinor>
<VersionMajor>1</VersionMajor>
<Guid>50a7e9b0-70ef-11d1-b75a-00a0c90564fe</Guid>
<Lcid>0</Lcid>
<WrapperTool>tlbimp</WrapperTool>
<Isolated>false</Isolated>
<EmbedInteropTypes>true</EmbedInteropTypes>
</COMReference>
<Content Include="Resources\Segoe Fluent Icons.ttf">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
Expand Down
74 changes: 73 additions & 1 deletion Flow.Launcher/ViewModel/MainViewModel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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
{
Expand Down Expand Up @@ -720,6 +722,68 @@ private void SetOpenResultModifiers()
OpenResultCommandModifiers = _settings.OpenResultModifiers ?? DefaultOpenResultModifiers;
}

private static string GetActiveExplorerPath()
{
// get the active window
IntPtr handle = GetForegroundWindow();
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.


// 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();
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I've gotten far more consistent results with the following. It also seems to handle special cases like the documents folder or the recycle bin folder.

string locationUrl = window.LocationURL;
if (!string.IsNullOrEmpty(locationUrl))
{
    string folderPath = new Uri(locationUrl).LocalPath;
    return folderPath;
}

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe you can fire a pr based on this one, and modify code there. @Garulf will have access to modify your pr so it would be easier to review and edit the code.


// 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)
Expand All @@ -734,6 +798,9 @@ public void ToggleFlowLauncher()

public void Show()
{
string _explorerPath = GetActiveExplorerPath();


if (_settings.UseSound)
{
MediaPlayer media = new MediaPlayer();
Expand All @@ -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()
Expand Down