mirror of
https://github.com/Artemis-RGB/Artemis
synced 2026-01-02 02:33:32 +00:00
Process Monitor - Switched to Processes instead of strings
This commit is contained in:
parent
fb51e75b94
commit
d4a0b0710c
@ -46,7 +46,8 @@ namespace Artemis.Core.Services
|
|||||||
IPluginManagementService pluginManagementService,
|
IPluginManagementService pluginManagementService,
|
||||||
IRgbService rgbService,
|
IRgbService rgbService,
|
||||||
IProfileService profileService,
|
IProfileService profileService,
|
||||||
IModuleService moduleService // injected to ensure module priorities get applied
|
IModuleService moduleService, // injected to ensure module priorities get applied
|
||||||
|
IProcessMonitorService processMonitorService //injected to keep track of processes
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
Kernel = kernel;
|
Kernel = kernel;
|
||||||
|
|||||||
@ -1,14 +1,15 @@
|
|||||||
using System;
|
using System;
|
||||||
|
using System.Diagnostics;
|
||||||
|
|
||||||
namespace Artemis.Core.Services
|
namespace Artemis.Core.Services
|
||||||
{
|
{
|
||||||
public class ProcessEventArgs : EventArgs
|
public class ProcessEventArgs : EventArgs
|
||||||
{
|
{
|
||||||
public string ProcessName { get; }
|
public Process Process { get; }
|
||||||
|
|
||||||
public ProcessEventArgs(string name)
|
public ProcessEventArgs(Process process)
|
||||||
{
|
{
|
||||||
ProcessName = name;
|
Process = process;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -13,6 +13,6 @@ namespace Artemis.Core.Services
|
|||||||
|
|
||||||
event EventHandler<ProcessEventArgs> ProcessStopped;
|
event EventHandler<ProcessEventArgs> ProcessStopped;
|
||||||
|
|
||||||
IEnumerable<string> GetRunningProcesses();
|
IEnumerable<Process> GetRunningProcesses();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -11,12 +11,12 @@ namespace Artemis.Core.Services
|
|||||||
{
|
{
|
||||||
private readonly ILogger _logger;
|
private readonly ILogger _logger;
|
||||||
private readonly Timer _processScanTimer;
|
private readonly Timer _processScanTimer;
|
||||||
private IEnumerable<string> _lastScannedProcesses;
|
private Process[] _lastScannedProcesses;
|
||||||
|
|
||||||
public ProcessMonitorService(ILogger logger)
|
public ProcessMonitorService(ILogger logger)
|
||||||
{
|
{
|
||||||
_logger = logger;
|
_logger = logger;
|
||||||
_lastScannedProcesses = Process.GetProcesses().Select(p => p.ProcessName).Distinct().ToArray();
|
_lastScannedProcesses = Process.GetProcesses().DistinctBy(p => p.ProcessName).ToArray();
|
||||||
_processScanTimer = new Timer(1000);
|
_processScanTimer = new Timer(1000);
|
||||||
_processScanTimer.Elapsed += OnTimerElapsed;
|
_processScanTimer.Elapsed += OnTimerElapsed;
|
||||||
_processScanTimer.Start();
|
_processScanTimer.Start();
|
||||||
@ -26,27 +26,43 @@ namespace Artemis.Core.Services
|
|||||||
|
|
||||||
public event EventHandler<ProcessEventArgs> ProcessStopped;
|
public event EventHandler<ProcessEventArgs> ProcessStopped;
|
||||||
|
|
||||||
public IEnumerable<string> GetRunningProcesses()
|
public IEnumerable<Process> GetRunningProcesses()
|
||||||
{
|
{
|
||||||
return _lastScannedProcesses;
|
return _lastScannedProcesses;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void OnTimerElapsed(object sender, ElapsedEventArgs e)
|
private void OnTimerElapsed(object sender, ElapsedEventArgs e)
|
||||||
{
|
{
|
||||||
var newProcesses = Process.GetProcesses().Select(p => p.ProcessName).Distinct();
|
var newProcesses = Process.GetProcesses().DistinctBy(p => p.ProcessName).ToArray();
|
||||||
foreach (var startedProcess in newProcesses.Except(_lastScannedProcesses))
|
foreach (var startedProcess in newProcesses.Except(_lastScannedProcesses, new ProcessComparer()))
|
||||||
{
|
{
|
||||||
ProcessStarted?.Invoke(this, new ProcessEventArgs(startedProcess));
|
ProcessStarted?.Invoke(this, new ProcessEventArgs(startedProcess));
|
||||||
_logger.Verbose("Started Process: {startedProcess}", startedProcess);
|
_logger.Debug("Started Process: {startedProcess}", startedProcess.ProcessName);
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach (var stoppedProcess in _lastScannedProcesses.Except(newProcesses))
|
foreach (var stoppedProcess in _lastScannedProcesses.Except(newProcesses, new ProcessComparer()))
|
||||||
{
|
{
|
||||||
ProcessStopped?.Invoke(this, new ProcessEventArgs(stoppedProcess));
|
ProcessStopped?.Invoke(this, new ProcessEventArgs(stoppedProcess));
|
||||||
_logger.Verbose("Stopped Process: {stoppedProcess}", stoppedProcess);
|
_logger.Debug("Stopped Process: {stoppedProcess}", stoppedProcess.ProcessName);
|
||||||
}
|
}
|
||||||
|
|
||||||
_lastScannedProcesses = newProcesses.ToArray();
|
_lastScannedProcesses = newProcesses;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
internal class ProcessComparer : IEqualityComparer<Process>
|
||||||
|
{
|
||||||
|
public bool Equals(Process? x, Process? y)
|
||||||
|
{
|
||||||
|
if (x == null && y == null) return true;
|
||||||
|
if (x == null || y == null) return false;
|
||||||
|
return x.Id == y.Id && x.ProcessName == y.ProcessName && x.SessionId == y.SessionId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int GetHashCode(Process obj)
|
||||||
|
{
|
||||||
|
if (obj == null) return 0;
|
||||||
|
return obj.Id;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user