mirror of
https://github.com/Flow-Launcher/Flow.Launcher.git
synced 2026-03-11 08:54:32 +00:00
ProcessKiller: add context menu option
to kill all processes whose file path matches with the selected result.
This commit is contained in:
parent
10ce003dac
commit
6e6a74beb9
2 changed files with 44 additions and 18 deletions
|
|
@ -6,5 +6,6 @@
|
||||||
<system:String x:Key="flowlauncher_plugin_processkiller_plugin_description">Kill running processes from Flow Launcher</system:String>
|
<system:String x:Key="flowlauncher_plugin_processkiller_plugin_description">Kill running processes from Flow Launcher</system:String>
|
||||||
|
|
||||||
<system:String x:Key="flowlauncher_plugin_processkiller_kill_all">kill all "{0}" processes</system:String>
|
<system:String x:Key="flowlauncher_plugin_processkiller_kill_all">kill all "{0}" processes</system:String>
|
||||||
|
<system:String x:Key="flowlauncher_plugin_processkiller_kill_instances">kill all instances</system:String>
|
||||||
|
|
||||||
</ResourceDictionary>
|
</ResourceDictionary>
|
||||||
|
|
@ -10,7 +10,7 @@ using Flow.Launcher.Infrastructure.Logger;
|
||||||
|
|
||||||
namespace Flow.Launcher.Plugin.ProcessKiller
|
namespace Flow.Launcher.Plugin.ProcessKiller
|
||||||
{
|
{
|
||||||
public class Main : IPlugin, IPluginI18n
|
public class Main : IPlugin, IPluginI18n, IContextMenu
|
||||||
{
|
{
|
||||||
private readonly HashSet<string> _systemProcessList = new HashSet<string>(){
|
private readonly HashSet<string> _systemProcessList = new HashSet<string>(){
|
||||||
"conhost",
|
"conhost",
|
||||||
|
|
@ -58,6 +58,34 @@ namespace Flow.Launcher.Plugin.ProcessKiller
|
||||||
return _context.API.GetTranslation("flowlauncher_plugin_processkiller_plugin_description");
|
return _context.API.GetTranslation("flowlauncher_plugin_processkiller_plugin_description");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public List<Result> LoadContextMenus(Result result)
|
||||||
|
{
|
||||||
|
var menuOptions = new List<Result>();
|
||||||
|
var processPath = result.SubTitle;
|
||||||
|
|
||||||
|
// get all non-system processes whose file path matches that of the given result (processPath)
|
||||||
|
var similarProcesses = Process.GetProcesses()
|
||||||
|
.Where(p => !IsSystemProcess(p) && GetProcessFilename(p) == processPath);
|
||||||
|
|
||||||
|
menuOptions.Add(new Result
|
||||||
|
{
|
||||||
|
Title = _context.API.GetTranslation("flowlauncher_plugin_processkiller_kill_instances"),
|
||||||
|
SubTitle = processPath,
|
||||||
|
Action = _ =>
|
||||||
|
{
|
||||||
|
foreach (var p in similarProcesses)
|
||||||
|
{
|
||||||
|
KillProcess(p);
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
},
|
||||||
|
IcoPath = "Images/app.png"
|
||||||
|
});
|
||||||
|
|
||||||
|
return menuOptions;
|
||||||
|
}
|
||||||
|
|
||||||
private List<Result> CreateResultsFromProcesses(List<ProcessResult> processlist, string termToSearch)
|
private List<Result> CreateResultsFromProcesses(List<ProcessResult> processlist, string termToSearch)
|
||||||
{
|
{
|
||||||
var results = new List<Result>();
|
var results = new List<Result>();
|
||||||
|
|
@ -105,29 +133,30 @@ namespace Flow.Launcher.Plugin.ProcessKiller
|
||||||
}
|
}
|
||||||
|
|
||||||
return results;
|
return results;
|
||||||
|
}
|
||||||
|
|
||||||
void KillProcess(Process p)
|
private void KillProcess(Process p)
|
||||||
|
{
|
||||||
|
try
|
||||||
{
|
{
|
||||||
try
|
if (!p.HasExited)
|
||||||
{
|
{
|
||||||
if (!p.HasExited)
|
p.Kill();
|
||||||
{
|
|
||||||
p.Kill();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (Exception e)
|
|
||||||
{
|
|
||||||
Log.Exception($"|ProcessKiller.CreateResultsFromProcesses|Failed to kill process {p.ProcessName}", e);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
Log.Exception($"|ProcessKiller.CreateResultsFromProcesses|Failed to kill process {p.ProcessName}", e);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private List<ProcessResult> GetProcesslist(string termToSearch)
|
private List<ProcessResult> GetProcesslist(string termToSearch)
|
||||||
{
|
{
|
||||||
var processlist = new List<ProcessResult>();
|
var processlist = new List<ProcessResult>();
|
||||||
|
|
||||||
foreach (var p in Process.GetProcesses())
|
foreach (var p in Process.GetProcesses())
|
||||||
{
|
{
|
||||||
if (FilterSystemProcesses(p)) continue;
|
if (IsSystemProcess(p)) continue;
|
||||||
|
|
||||||
if (string.IsNullOrWhiteSpace(termToSearch))
|
if (string.IsNullOrWhiteSpace(termToSearch))
|
||||||
{
|
{
|
||||||
|
|
@ -145,14 +174,10 @@ namespace Flow.Launcher.Plugin.ProcessKiller
|
||||||
}
|
}
|
||||||
|
|
||||||
return processlist;
|
return processlist;
|
||||||
|
|
||||||
bool FilterSystemProcesses(Process p)
|
|
||||||
{
|
|
||||||
var name = p.ProcessName.ToLower();
|
|
||||||
return _systemProcessList.Contains(name);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private bool IsSystemProcess(Process p) => _systemProcessList.Contains(p.ProcessName.ToLower());
|
||||||
|
|
||||||
internal class ProcessResult
|
internal class ProcessResult
|
||||||
{
|
{
|
||||||
public ProcessResult(Process process, int score)
|
public ProcessResult(Process process, int score)
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue