-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathProcessMonitor.cs
More file actions
148 lines (129 loc) · 5.1 KB
/
Copy pathProcessMonitor.cs
File metadata and controls
148 lines (129 loc) · 5.1 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
using System;
using System.Diagnostics;
using System.Management;
namespace CPUBoostManager
{
public class ProcessMonitor
{
private readonly GameDetector _gameDetector;
private readonly PowerManager _powerManager;
private ManagementEventWatcher? _processStartWatcher;
private ManagementEventWatcher? _processStopWatcher;
private bool _isMonitoring = false;
public ProcessMonitor(GameDetector gameDetector, PowerManager powerManager)
{
_gameDetector = gameDetector;
_powerManager = powerManager;
}
public void StartMonitoring()
{
if (_isMonitoring) return;
try
{
// Set up WMI query for process start events
var startQuery = new WqlEventQuery("SELECT * FROM __InstanceCreationEvent WITHIN 1 WHERE TargetInstance ISA 'Win32_Process'");
_processStartWatcher = new ManagementEventWatcher(startQuery);
_processStartWatcher.EventArrived += ProcessStarted;
_processStartWatcher.Start();
// Set up WMI query for process stop events
var stopQuery = new WqlEventQuery("SELECT * FROM __InstanceDeletionEvent WITHIN 1 WHERE TargetInstance ISA 'Win32_Process'");
_processStopWatcher = new ManagementEventWatcher(stopQuery);
_processStopWatcher.EventArrived += ProcessStopped;
_processStopWatcher.Start();
_isMonitoring = true;
Console.WriteLine("Process monitoring started.");
// Check for existing game processes
CheckExistingProcesses();
}
catch (Exception ex)
{
Console.WriteLine($"Error starting process monitoring: {ex.Message}");
StopMonitoring();
}
}
public void StopMonitoring()
{
if (!_isMonitoring) return;
try
{
_processStartWatcher?.Stop();
_processStopWatcher?.Stop();
_processStartWatcher?.Dispose();
_processStopWatcher?.Dispose();
_processStartWatcher = null;
_processStopWatcher = null;
_isMonitoring = false;
Console.WriteLine("Process monitoring stopped.");
// Re-enable boost when monitoring stops
_powerManager.EnableBoost();
}
catch (Exception ex)
{
Console.WriteLine($"Error stopping process monitoring: {ex.Message}");
}
}
private void ProcessStarted(object sender, EventArrivedEventArgs e)
{
try
{
var processInstance = (ManagementBaseObject)e.NewEvent["TargetInstance"];
int processId = Convert.ToInt32(processInstance["ProcessId"]);
string processName = processInstance["Name"].ToString() ?? string.Empty;
var process = Process.GetProcessById(processId);
if (_gameDetector.IsGameProcess(process))
{
_gameDetector.RegisterGameProcess(process);
_powerManager.DisableBoost();
}
}
catch (Exception ex)
{
Console.WriteLine($"Error processing start event: {ex.Message}");
}
}
private void ProcessStopped(object sender, EventArrivedEventArgs e)
{
try
{
var processInstance = (ManagementBaseObject)e.NewEvent["TargetInstance"];
int processId = Convert.ToInt32(processInstance["ProcessId"]);
_gameDetector.UnregisterGameProcess(processId);
// If no more games are running, re-enable CPU boost
if (!_gameDetector.HasActiveGames())
{
_powerManager.EnableBoost();
}
}
catch (Exception ex)
{
Console.WriteLine($"Error processing stop event: {ex.Message}");
}
}
private void CheckExistingProcesses()
{
try
{
foreach (var process in Process.GetProcesses())
{
try
{
if (_gameDetector.IsGameProcess(process))
{
_gameDetector.RegisterGameProcess(process);
_powerManager.DisableBoost();
break; // Found at least one game running, so disable boost
}
}
catch
{
// Skip any process we can't access
}
}
}
catch (Exception ex)
{
Console.WriteLine($"Error checking existing processes: {ex.Message}");
}
}
}
}