@@ -12,21 +12,7 @@ namespace Flow.Launcher.Plugin.ProcessKiller
12
12
{
13
13
public class Main : IPlugin , IPluginI18n , IContextMenu
14
14
{
15
- private readonly HashSet < string > _systemProcessList = new HashSet < string > ( ) {
16
- "conhost" ,
17
- "svchost" ,
18
- "idle" ,
19
- "system" ,
20
- "rundll32" ,
21
- "csrss" ,
22
- "lsass" ,
23
- "lsm" ,
24
- "smss" ,
25
- "wininit" ,
26
- "winlogon" ,
27
- "services" ,
28
- "spoolsv" ,
29
- "explorer" } ;
15
+ private ProcessHelper processHelper = new ProcessHelper ( ) ;
30
16
31
17
private static PluginInitContext _context ;
32
18
@@ -41,7 +27,7 @@ public List<Result> Query(Query query)
41
27
? null
42
28
: string . Join ( Plugin . Query . TermSeperater , query . Terms . Skip ( 1 ) ) . ToLower ( ) ;
43
29
44
- var processlist = GetProcesslist ( termToSearch ) ;
30
+ var processlist = processHelper . GetMatchingProcesses ( termToSearch ) ;
45
31
46
32
return ! processlist . Any ( )
47
33
? null
@@ -64,8 +50,7 @@ public List<Result> LoadContextMenus(Result result)
64
50
var processPath = result . SubTitle ;
65
51
66
52
// get all non-system processes whose file path matches that of the given result (processPath)
67
- var similarProcesses = Process . GetProcesses ( )
68
- . Where ( p => ! IsSystemProcess ( p ) && GetProcessFilename ( p ) == processPath ) ;
53
+ var similarProcesses = processHelper . GetSimilarProcesses ( processPath ) ;
69
54
70
55
menuOptions . Add ( new Result
71
56
{
@@ -75,7 +60,7 @@ public List<Result> LoadContextMenus(Result result)
75
60
{
76
61
foreach ( var p in similarProcesses )
77
62
{
78
- KillProcess ( p ) ;
63
+ processHelper . TryKill ( p ) ;
79
64
}
80
65
81
66
return true ;
@@ -93,7 +78,7 @@ private List<Result> CreateResultsFromProcesses(List<ProcessResult> processlist,
93
78
foreach ( var pr in processlist )
94
79
{
95
80
var p = pr . Process ;
96
- var path = GetPath ( p ) ;
81
+ var path = processHelper . TryGetProcessFilename ( p ) ;
97
82
results . Add ( new Result ( )
98
83
{
99
84
IcoPath = path ,
@@ -103,7 +88,7 @@ private List<Result> CreateResultsFromProcesses(List<ProcessResult> processlist,
103
88
Score = pr . Score ,
104
89
Action = ( c ) =>
105
90
{
106
- KillProcess ( p ) ;
91
+ processHelper . TryKill ( p ) ;
107
92
return true ;
108
93
}
109
94
} ) ;
@@ -116,15 +101,15 @@ private List<Result> CreateResultsFromProcesses(List<ProcessResult> processlist,
116
101
{
117
102
results . Insert ( 0 , new Result ( )
118
103
{
119
- IcoPath = "Images\\ app.png" ,
104
+ IcoPath = "Images/ app.png" ,
120
105
Title = string . Format ( _context . API . GetTranslation ( "flowlauncher_plugin_processkiller_kill_all" ) , termToSearch ) ,
121
106
SubTitle = "" ,
122
107
Score = 200 ,
123
108
Action = ( c ) =>
124
109
{
125
110
foreach ( var p in processlist )
126
111
{
127
- KillProcess ( p . Process ) ;
112
+ processHelper . TryKill ( p . Process ) ;
128
113
}
129
114
130
115
return true ;
@@ -134,105 +119,5 @@ private List<Result> CreateResultsFromProcesses(List<ProcessResult> processlist,
134
119
135
120
return results ;
136
121
}
137
-
138
- private void KillProcess ( Process p )
139
- {
140
- try
141
- {
142
- if ( ! p . HasExited )
143
- {
144
- p . Kill ( ) ;
145
- }
146
- }
147
- catch ( Exception e )
148
- {
149
- Log . Exception ( $ "|ProcessKiller.CreateResultsFromProcesses|Failed to kill process { p . ProcessName } ", e ) ;
150
- }
151
- }
152
-
153
- private List < ProcessResult > GetProcesslist ( string termToSearch )
154
- {
155
- var processlist = new List < ProcessResult > ( ) ;
156
-
157
- foreach ( var p in Process . GetProcesses ( ) )
158
- {
159
- if ( IsSystemProcess ( p ) ) continue ;
160
-
161
- if ( string . IsNullOrWhiteSpace ( termToSearch ) )
162
- {
163
- // show all non-system processes
164
- processlist . Add ( new ProcessResult ( p , 0 ) ) ;
165
- }
166
- else
167
- {
168
- var score = StringMatcher . FuzzySearch ( termToSearch , p . ProcessName + p . Id ) . Score ;
169
- if ( score > 0 )
170
- {
171
- processlist . Add ( new ProcessResult ( p , score ) ) ;
172
- }
173
- }
174
- }
175
-
176
- return processlist ;
177
- }
178
-
179
- private bool IsSystemProcess ( Process p ) => _systemProcessList . Contains ( p . ProcessName . ToLower ( ) ) ;
180
-
181
- internal class ProcessResult
182
- {
183
- public ProcessResult ( Process process , int score )
184
- {
185
- Process = process ;
186
- Score = score ;
187
- }
188
-
189
- public Process Process { get ; }
190
-
191
- public int Score { get ; }
192
- }
193
-
194
- private string GetPath ( Process p )
195
- {
196
- try
197
- {
198
- return GetProcessFilename ( p ) ;
199
- }
200
- catch
201
- {
202
- return "" ;
203
- }
204
- }
205
-
206
- [ Flags ]
207
- private enum ProcessAccessFlags : uint
208
- {
209
- QueryLimitedInformation = 0x00001000
210
- }
211
-
212
- [ DllImport ( "kernel32.dll" , SetLastError = true ) ]
213
- private static extern bool QueryFullProcessImageName (
214
- [ In ] IntPtr hProcess ,
215
- [ In ] int dwFlags ,
216
- [ Out ] StringBuilder lpExeName ,
217
- ref int lpdwSize ) ;
218
-
219
- [ DllImport ( "kernel32.dll" , SetLastError = true ) ]
220
- private static extern IntPtr OpenProcess (
221
- ProcessAccessFlags processAccess ,
222
- bool bInheritHandle ,
223
- int processId ) ;
224
-
225
- private string GetProcessFilename ( Process p )
226
- {
227
- int capacity = 2000 ;
228
- StringBuilder builder = new StringBuilder ( capacity ) ;
229
- IntPtr ptr = OpenProcess ( ProcessAccessFlags . QueryLimitedInformation , false , p . Id ) ;
230
- if ( ! QueryFullProcessImageName ( ptr , 0 , builder , ref capacity ) )
231
- {
232
- return String . Empty ;
233
- }
234
-
235
- return builder . ToString ( ) ;
236
- }
237
122
}
238
123
}
0 commit comments