Changeset 2 for trunk/UFormMain.pas
- Timestamp:
- Jan 14, 2018, 9:18:41 AM (5 years ago)
- Location:
- trunk
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk
-
Property svn:ignore
set to
lib
heaptrclog.trc
OpenTaskManager
OpenTaskManager.lps
*.lrj
-
Property svn:ignore
set to
-
trunk/UFormMain.pas
r1 r2 24 24 25 25 TSystemProcesses = class(TObjectList) 26 26 end; 27 28 TSystemServiceState = (ssStopped, ssRunning); 29 30 TSystemService = class 31 Name: string; 32 Description: string; 33 State: TSystemServiceState; 34 end; 35 36 TSystemServices = class(TObjectList) 27 37 end; 28 38 … … 49 59 MenuItem15: TMenuItem; 50 60 MenuItem16: TMenuItem; 61 MenuItem17: TMenuItem; 62 MenuItem18: TMenuItem; 63 MenuItem19: TMenuItem; 51 64 MenuItem2: TMenuItem; 65 MenuItem20: TMenuItem; 66 MenuItem21: TMenuItem; 67 MenuItem22: TMenuItem; 68 MenuItem23: TMenuItem; 69 MenuItem24: TMenuItem; 70 MenuItem25: TMenuItem; 71 MenuItem26: TMenuItem; 72 MenuItem27: TMenuItem; 73 MenuItem28: TMenuItem; 74 MenuItem29: TMenuItem; 52 75 MenuItem3: TMenuItem; 76 MenuItem30: TMenuItem; 77 MenuItem31: TMenuItem; 78 MenuItem32: TMenuItem; 79 MenuItem33: TMenuItem; 80 MenuItem34: TMenuItem; 81 MenuItem35: TMenuItem; 82 MenuItem36: TMenuItem; 83 MenuItem37: TMenuItem; 84 MenuItem38: TMenuItem; 85 MenuItem39: TMenuItem; 53 86 MenuItem4: TMenuItem; 87 MenuItem40: TMenuItem; 54 88 MenuItem5: TMenuItem; 55 89 MenuItem6: TMenuItem; … … 61 95 PageControl1: TPageControl; 62 96 Panel1: TPanel; 97 PopupMenuProcesses: TPopupMenu; 98 PopupMenuDetails: TPopupMenu; 63 99 PopupMenuTrayIcon: TPopupMenu; 64 100 TabSheet1: TTabSheet; 65 101 TabSheet2: TTabSheet; 66 102 TabSheet3: TTabSheet; 67 Services: TTabSheet;103 TabSheetServices: TTabSheet; 68 104 TabSheetDetails: TTabSheet; 69 105 TabSheetUsers: TTabSheet; … … 80 116 procedure ListViewDetailsData(Sender: TObject; Item: TListItem); 81 117 procedure ListViewProcessesData(Sender: TObject; Item: TListItem); 118 procedure ListViewServicesData(Sender: TObject; Item: TListItem); 119 procedure PageControl1Change(Sender: TObject); 82 120 procedure TimerRefreshTimer(Sender: TObject); 121 procedure TrayIcon1Click(Sender: TObject); 83 122 private 84 123 Processes: TSystemProcesses; 124 Services: TSystemServices; 85 125 function Cut(var Text: string; Separator: string): string; 126 procedure ReloadTab; 86 127 procedure ReloadProcessList; 128 procedure ReloadServiceList; 129 function ExecuteAnWaitForOutput(Executable: string; Parameters: array of string): string; 87 130 public 88 131 … … 99 142 SRunNewTask = 'Run new task'; 100 143 SRunNewTaskPrompt = 'Enter name of a program, service, document or resource from the Internet and Windows system will open it.'; 144 145 var 146 SystemServiceStatusText: array [TSystemServiceState] of string = ('Running', 'Stopped'); 101 147 { TFormMain } 102 148 … … 133 179 begin 134 180 Processes := TSystemProcesses.Create; 181 Services := TSystemServices.Create; 135 182 end; 136 183 137 184 procedure TFormMain.FormDestroy(Sender: TObject); 138 185 begin 186 Services.Free; 139 187 Processes.Free; 140 188 end; … … 142 190 procedure TFormMain.FormShow(Sender: TObject); 143 191 begin 144 TimerRefreshTimer(nil); 192 PageControl1.TabIndex := 0; 193 ReloadTab; 145 194 TimerRefresh.Enabled := True; 146 195 end; … … 177 226 end; 178 227 228 procedure TFormMain.ListViewServicesData(Sender: TObject; Item: TListItem); 229 begin 230 if Item.Index < Services.Count then 231 with TSystemService(Services[Item.Index]) do begin 232 Item.Caption := Name; 233 Item.SubItems.Add(''); 234 Item.SubItems.Add(Description); 235 Item.SubItems.Add(SystemServiceStatusText[State]); 236 Item.SubItems.Add(''); 237 end; 238 end; 239 240 procedure TFormMain.PageControl1Change(Sender: TObject); 241 begin 242 ReloadTab; 243 end; 244 179 245 procedure TFormMain.TimerRefreshTimer(Sender: TObject); 180 246 begin 181 if PageControl1.ActivePage = TabSheetProcesses then begin 182 ReloadProcessList; 183 ListViewProcesses.Items.Count := Processes.Count; 184 ListViewProcesses.Refresh; 185 end; 186 if PageControl1.ActivePage = TabSheetDetails then begin 187 ReloadProcessList; 188 ListViewDetails.Items.Count := Processes.Count; 189 ListViewDetails.Refresh; 190 end; 247 ReloadTab; 248 end; 249 250 procedure TFormMain.TrayIcon1Click(Sender: TObject); 251 begin 252 191 253 end; 192 254 … … 202 264 end; 203 265 266 procedure TFormMain.ReloadTab; 267 begin 268 if PageControl1.ActivePage = TabSheetProcesses then begin 269 ReloadProcessList; 270 ListViewProcesses.Items.Count := Processes.Count; 271 ListViewProcesses.Refresh; 272 end; 273 if PageControl1.ActivePage = TabSheetDetails then begin 274 ReloadProcessList; 275 ListViewDetails.Items.Count := Processes.Count; 276 ListViewDetails.Refresh; 277 end; 278 if PageControl1.ActivePage = TabSheetServices then begin 279 ReloadServiceList; 280 ListViewServices.Items.Count := Services.Count; 281 ListViewServices.Refresh; 282 end; 283 end; 284 204 285 procedure TFormMain.ReloadProcessList; 205 286 var 206 Process: TProcess;207 287 Lines: TStringList; 208 288 I: Integer; … … 211 291 begin 212 292 Processes.Clear; 213 Process := TProcess.Create(nil);214 293 Lines := TStringList.Create; 215 with Process do216 294 try 217 Executable := '/bin/ps'; 218 Parameters.Add('auxw'); 219 Options := [poNoConsole, poWaitOnExit, poUsePipes]; 220 Execute; 221 Lines.LoadFromStream(Output); 295 Lines.Text := ExecuteAnWaitForOutput('/bin/ps', ['auxw']); 222 296 for I := 1 to Lines.Count - 1 do begin 223 297 Line := Lines[I]; … … 245 319 finally 246 320 Lines.Free; 321 end; 322 end; 323 324 procedure TFormMain.ReloadServiceList; 325 var 326 Process: TProcess; 327 Lines: TStringList; 328 I: Integer; 329 NewService: TSystemService; 330 Line: string; 331 State: string; 332 begin 333 Services.Clear; 334 Process := TProcess.Create(nil); 335 Lines := TStringList.Create; 336 try 337 Lines.Text := ExecuteAnWaitForOutput('/bin/systemctl', ['list-units', 338 '--no-pager', '--all', '--plain', '--no-legend']); 339 for I := 0 to Lines.Count - 1 do begin 340 Line := Lines[I]; 341 while Pos(' ', Line) > 0 do 342 Line := StringReplace(Line, ' ', ' ', [rfReplaceAll]); 343 NewService := TSystemService.Create; 344 NewService.Name := Cut(Line, ' '); 345 Cut(Line, ' '); 346 Cut(Line, ' '); 347 State := Cut(Line, ' '); 348 if State = 'running' then NewService.State := ssRunning 349 else NewService.State := ssStopped; 350 NewService.Description := Line; 351 Services.Add(NewService); 352 end; 353 finally 354 Lines.Free; 355 end; 356 end; 357 358 function TFormMain.ExecuteAnWaitForOutput(Executable: string; 359 Parameters: array of string): string; 360 var 361 Process: TProcess; 362 OutputStream: TMemoryStream; 363 I: Integer; 364 BytesRead: Integer; 365 Buffer: array[0..2047] of Byte; 366 begin 367 Process := TProcess.Create(nil); 368 OutputStream := TMemoryStream.Create; 369 try 370 Process.Executable := Executable; 371 for I := 0 to Length(Parameters) - 1 do 372 Process.Parameters.Add(Parameters[I]); 373 Process.Options := [poNoConsole, poUsePipes]; 374 Process.Execute; 375 376 repeat 377 BytesRead := Process.Output.Read(Buffer, Length(Buffer)); 378 OutputStream.Write(Buffer, BytesRead) 379 until BytesRead = 0; 380 381 SetLength(Result, OutputStream.Size); 382 if OutputStream.Size > 0 then begin; 383 OutputStream.Position := 0; 384 OutputStream.Read(Result[1], OutputStream.Size); 385 end else Result := ''; 386 finally 387 OutputStream.Free; 247 388 Process.Free; 248 389 end;
Note:
See TracChangeset
for help on using the changeset viewer.