diff --git a/src/Artemis.Core/Services/CoreService.cs b/src/Artemis.Core/Services/CoreService.cs index 19b9b6210..6c2c69c21 100644 --- a/src/Artemis.Core/Services/CoreService.cs +++ b/src/Artemis.Core/Services/CoreService.cs @@ -46,7 +46,8 @@ namespace Artemis.Core.Services IPluginManagementService pluginManagementService, IRgbService rgbService, 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; diff --git a/src/Artemis.Core/Services/ProcessMonitor/Events/ProcessEventArgs.cs b/src/Artemis.Core/Services/ProcessMonitor/Events/ProcessEventArgs.cs index beb5e42e9..65482023b 100644 --- a/src/Artemis.Core/Services/ProcessMonitor/Events/ProcessEventArgs.cs +++ b/src/Artemis.Core/Services/ProcessMonitor/Events/ProcessEventArgs.cs @@ -1,14 +1,15 @@ using System; +using System.Diagnostics; namespace Artemis.Core.Services { public class ProcessEventArgs : EventArgs { - public string ProcessName { get; } + public Process Process { get; } - public ProcessEventArgs(string name) + public ProcessEventArgs(Process process) { - ProcessName = name; + Process = process; } } } diff --git a/src/Artemis.Core/Services/ProcessMonitor/Interfaces/IProcessMonitorService.cs b/src/Artemis.Core/Services/ProcessMonitor/Interfaces/IProcessMonitorService.cs index 907af1607..37ae223ae 100644 --- a/src/Artemis.Core/Services/ProcessMonitor/Interfaces/IProcessMonitorService.cs +++ b/src/Artemis.Core/Services/ProcessMonitor/Interfaces/IProcessMonitorService.cs @@ -13,6 +13,6 @@ namespace Artemis.Core.Services event EventHandler ProcessStopped; - IEnumerable GetRunningProcesses(); + IEnumerable GetRunningProcesses(); } } diff --git a/src/Artemis.Core/Services/ProcessMonitor/ProcessMonitorService.cs b/src/Artemis.Core/Services/ProcessMonitor/ProcessMonitorService.cs index 3b3eefc55..a487fc626 100644 --- a/src/Artemis.Core/Services/ProcessMonitor/ProcessMonitorService.cs +++ b/src/Artemis.Core/Services/ProcessMonitor/ProcessMonitorService.cs @@ -11,12 +11,12 @@ namespace Artemis.Core.Services { private readonly ILogger _logger; private readonly Timer _processScanTimer; - private IEnumerable _lastScannedProcesses; + private Process[] _lastScannedProcesses; public ProcessMonitorService(ILogger 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.Elapsed += OnTimerElapsed; _processScanTimer.Start(); @@ -26,27 +26,43 @@ namespace Artemis.Core.Services public event EventHandler ProcessStopped; - public IEnumerable GetRunningProcesses() + public IEnumerable GetRunningProcesses() { return _lastScannedProcesses; } private void OnTimerElapsed(object sender, ElapsedEventArgs e) { - var newProcesses = Process.GetProcesses().Select(p => p.ProcessName).Distinct(); - foreach (var startedProcess in newProcesses.Except(_lastScannedProcesses)) + var newProcesses = Process.GetProcesses().DistinctBy(p => p.ProcessName).ToArray(); + foreach (var startedProcess in newProcesses.Except(_lastScannedProcesses, new ProcessComparer())) { 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)); - _logger.Verbose("Stopped Process: {stoppedProcess}", stoppedProcess); + _logger.Debug("Stopped Process: {stoppedProcess}", stoppedProcess.ProcessName); } - _lastScannedProcesses = newProcesses.ToArray(); + _lastScannedProcesses = newProcesses; + } + } + + internal class ProcessComparer : IEqualityComparer + { + 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; } } }