Skip to content
1 change: 1 addition & 0 deletions Flow.Launcher/MainWindow.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@
<KeyBinding Key="Home" Modifiers="Alt" Command="{Binding SelectFirstResultCommand}"></KeyBinding>
<KeyBinding Key="O" Modifiers="Ctrl" Command="{Binding LoadContextMenuCommand}"></KeyBinding>
<KeyBinding Key="H" Modifiers="Ctrl" Command="{Binding LoadHistoryCommand}"></KeyBinding>
<KeyBinding Key="Enter" Modifiers="Ctrl+Shift" Command="{Binding OpenResultCommand}"></KeyBinding>
<KeyBinding Key="Enter" Modifiers="Shift" Command="{Binding LoadContextMenuCommand}"></KeyBinding>
<KeyBinding Key="Enter" Command="{Binding OpenResultCommand}"></KeyBinding>
<KeyBinding Key="Enter" Modifiers="Ctrl" Command="{Binding OpenResultCommand}"></KeyBinding>
Expand Down
23 changes: 22 additions & 1 deletion Plugins/Flow.Launcher.Plugin.Explorer/Search/ResultManager.cs
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
using Flow.Launcher.Infrastructure;
using Flow.Launcher.Plugin.SharedCommands;
using System;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using System.Windows;

namespace Flow.Launcher.Plugin.Explorer.Search
Expand Down Expand Up @@ -127,7 +129,26 @@ internal static Result CreateFileResult(string filePath, Query query, int score
{
try
{
if (c.SpecialKeyState.CtrlPressed)
if (File.Exists(filePath) && c.SpecialKeyState.CtrlPressed && c.SpecialKeyState.ShiftPressed)
{
Task.Run(() =>
{
try
{
Process.Start(new ProcessStartInfo
{
FileName = filePath,
UseShellExecute = true,
Verb = "runas",
});
}
catch (Exception e)
{
MessageBox.Show(e.Message, "Could not start " + filePath);
}
});
}
else if (c.SpecialKeyState.CtrlPressed)
{
FilesFolders.OpenContainingFolder(filePath);
}
Expand Down
2 changes: 1 addition & 1 deletion Plugins/Flow.Launcher.Plugin.Explorer/plugin.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
"Name": "Explorer",
"Description": "Search and manage files and folders. Explorer utilises Windows Index Search",
"Author": "Jeremy Wu",
"Version": "1.8.5",
"Version": "1.9.0",
"Language": "csharp",
"Website": "https://github.com/Flow-Launcher/Flow.Launcher",
"ExecuteFileName": "Flow.Launcher.Plugin.Explorer.dll",
Expand Down
1 change: 1 addition & 0 deletions Plugins/Flow.Launcher.Plugin.Program/Languages/en.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -53,5 +53,6 @@
<!--Dialogs-->
<system:String x:Key="flowlauncher_plugin_program_disable_dlgtitle_success">Success</system:String>
<system:String x:Key="flowlauncher_plugin_program_disable_dlgtitle_success_message">Successfully disabled this program from displaying in your query</system:String>
<system:String x:Key="flowlauncher_plugin_program_run_as_administrator_not_supported_message">This app is not intended to be run as administrator</system:String>

</ResourceDictionary>
1 change: 1 addition & 0 deletions Plugins/Flow.Launcher.Plugin.Program/Languages/zh-tw.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -33,4 +33,5 @@

<system:String x:Key="flowlauncher_plugin_program_plugin_name">程式</system:String>
<system:String x:Key="flowlauncher_plugin_program_plugin_description">在 Flow Launcher 中搜尋程式</system:String>

</ResourceDictionary>
76 changes: 75 additions & 1 deletion Plugins/Flow.Launcher.Plugin.Program/Programs/UWP.cs
Original file line number Diff line number Diff line change
Expand Up @@ -267,6 +267,7 @@ public class Application : IProgram
public string Location => Package.Location;

public bool Enabled { get; set; }
public bool CanRunElevated { get; set; }

public string LogoUri { get; set; }
public string LogoPath { get; set; }
Expand Down Expand Up @@ -320,7 +321,29 @@ public Result Result(string query, IPublicAPI api)
ContextData = this,
Action = e =>
{
Launch(api);
var elevated = (
e.SpecialKeyState.CtrlPressed &&
e.SpecialKeyState.ShiftPressed &&
!e.SpecialKeyState.AltPressed &&
!e.SpecialKeyState.WinPressed
);

if (elevated && CanRunElevated)
{
LaunchElevated();
}
else
{
Launch(api);

if (elevated)
{
var title = "Plugin: Program";
var message = api.GetTranslation("flowlauncher_plugin_program_run_as_administrator_not_supported_message");
api.ShowMsg(title, message, string.Empty);
}
}

return true;
}
};
Expand Down Expand Up @@ -354,6 +377,21 @@ public List<Result> ContextMenus(IPublicAPI api)
IcoPath = "Images/folder.png"
}
};

if (CanRunElevated)
{
contextMenus.Add(new Result
{
Title = api.GetTranslation("flowlauncher_plugin_program_run_as_administrator"),
Action = _ =>
{
LaunchElevated();
return true;
},
IcoPath = "Images/cmd.png"
});
}

return contextMenus;
}

Expand All @@ -377,6 +415,20 @@ await Task.Run(() =>
});
}

private async void LaunchElevated()
{
string command = "shell:AppsFolder\\" + UniqueIdentifier;
command = Environment.ExpandEnvironmentVariables(command.Trim());

var info = new ProcessStartInfo(command)
{
UseShellExecute = true,
Verb = "runas",
};

Main.StartProcess(Process.Start, info);
}

public Application(AppxPackageHelper.IAppxManifestApplication manifestApp, UWP package)
{
// This is done because we cannot use the keyword 'out' along with a property
Expand All @@ -403,6 +455,28 @@ public Application(AppxPackageHelper.IAppxManifestApplication manifestApp, UWP p
LogoPath = LogoPathFromUri(LogoUri);

Enabled = true;
CanRunElevated = CanApplicationRunElevated();
}

private bool CanApplicationRunElevated()
{
if (EntryPoint == "Windows.FullTrustApplication")
{
return true;
}

var manifest = Package.Location + "\\AppxManifest.xml";
if (File.Exists(manifest))
{
var file = File.ReadAllText(manifest);

if (file.Contains("TrustLevel=\"mediumIL\"", StringComparison.OrdinalIgnoreCase))
{
return true;
}
}

return false;
}

internal string ResourceFromPri(string packageFullName, string packageName, string rawReferenceValue)
Expand Down
14 changes: 11 additions & 3 deletions Plugins/Flow.Launcher.Plugin.Program/Programs/Win32.cs
Original file line number Diff line number Diff line change
Expand Up @@ -102,16 +102,24 @@ public Result Result(string query, IPublicAPI api)
Score = matchResult.Score,
TitleHighlightData = matchResult.MatchData,
ContextData = this,
Action = _ =>
Action = c =>
{
var runAsAdmin = (
c.SpecialKeyState.CtrlPressed &&
c.SpecialKeyState.ShiftPressed &&
!c.SpecialKeyState.AltPressed &&
!c.SpecialKeyState.WinPressed
);

var info = new ProcessStartInfo
{
FileName = LnkResolvedPath ?? FullPath,
WorkingDirectory = ParentDirectory,
UseShellExecute = true
UseShellExecute = true,
Verb = runAsAdmin ? "runas" : null
};

Main.StartProcess(Process.Start, info);
Task.Run(() => Main.StartProcess(Process.Start, info));

return true;
}
Expand Down
2 changes: 1 addition & 1 deletion Plugins/Flow.Launcher.Plugin.Program/plugin.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
"Name": "Program",
"Description": "Search programs in Flow.Launcher",
"Author": "qianlifeng",
"Version": "1.5.4",
"Version": "1.6.0",
"Language": "csharp",
"Website": "https://github.com/Flow-Launcher/Flow.Launcher",
"ExecuteFileName": "Flow.Launcher.Plugin.Program.dll",
Expand Down
36 changes: 32 additions & 4 deletions Plugins/Flow.Launcher.Plugin.Shell/Main.cs
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,14 @@ public List<Result> Query(Query query)
IcoPath = Image,
Action = c =>
{
Execute(Process.Start, PrepareProcessStartInfo(m, c.SpecialKeyState.CtrlPressed));
var runAsAdministrator = (
c.SpecialKeyState.CtrlPressed &&
c.SpecialKeyState.ShiftPressed &&
!c.SpecialKeyState.AltPressed &&
!c.SpecialKeyState.WinPressed
);

Execute(Process.Start, PrepareProcessStartInfo(m, runAsAdministrator));
return true;
}
}));
Expand Down Expand Up @@ -106,7 +113,14 @@ private List<Result> GetHistoryCmds(string cmd, Result result)
IcoPath = Image,
Action = c =>
{
Execute(Process.Start, PrepareProcessStartInfo(m.Key));
var runAsAdministrator = (
c.SpecialKeyState.CtrlPressed &&
c.SpecialKeyState.ShiftPressed &&
!c.SpecialKeyState.AltPressed &&
!c.SpecialKeyState.WinPressed
);

Execute(Process.Start, PrepareProcessStartInfo(m.Key, runAsAdministrator));
return true;
}
};
Expand All @@ -129,7 +143,14 @@ private Result GetCurrentCmd(string cmd)
IcoPath = Image,
Action = c =>
{
Execute(Process.Start, PrepareProcessStartInfo(cmd));
var runAsAdministrator = (
c.SpecialKeyState.CtrlPressed &&
c.SpecialKeyState.ShiftPressed &&
!c.SpecialKeyState.AltPressed &&
!c.SpecialKeyState.WinPressed
);

Execute(Process.Start, PrepareProcessStartInfo(cmd, runAsAdministrator));
return true;
}
};
Expand All @@ -147,7 +168,14 @@ private List<Result> ResultsFromlHistory()
IcoPath = Image,
Action = c =>
{
Execute(Process.Start, PrepareProcessStartInfo(m.Key));
var runAsAdministrator = (
c.SpecialKeyState.CtrlPressed &&
c.SpecialKeyState.ShiftPressed &&
!c.SpecialKeyState.AltPressed &&
!c.SpecialKeyState.WinPressed
);

Execute(Process.Start, PrepareProcessStartInfo(m.Key, runAsAdministrator));
return true;
}
});
Expand Down
2 changes: 1 addition & 1 deletion Plugins/Flow.Launcher.Plugin.Shell/plugin.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
"Name": "Shell",
"Description": "Provide executing commands from Flow Launcher",
"Author": "qianlifeng",
"Version": "1.4.3",
"Version": "1.4.4",
"Language": "csharp",
"Website": "https://github.com/Flow-Launcher/Flow.Launcher",
"ExecuteFileName": "Flow.Launcher.Plugin.Shell.dll",
Expand Down