Skip to content

Commit 9bbefab

Browse files
committed
1.5.3
Stability improvements for process watcher Administrative rights aren't necessary anymore (delete schedular task "HDR-Profile" manually)
1 parent b89a324 commit 9bbefab

File tree

11 files changed

+104
-141
lines changed

11 files changed

+104
-141
lines changed

Source/Debug_x64/HDRProfile.exe

-169 KB
Binary file not shown.

Source/Debug_x64/HDRProfile_Settings.xml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,15 @@
22
<HDRProfileSettings xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
33
<AutoStart>false</AutoStart>
44
<Logging>true</Logging>
5-
<StartMinimizedToTray>true</StartMinimizedToTray>
5+
<StartMinimizedToTray>false</StartMinimizedToTray>
66
<CloseToTray>true</CloseToTray>
7-
<HDRMode>Focused</HDRMode>
7+
<HDRMode>Running</HDRMode>
88
<ApplicationItems>
99
<ApplicationItem>
1010
<DisplayName>notepad</DisplayName>
1111
<ApplicationName>notepad</ApplicationName>
1212
<ApplicationFilePath>C:\Windows\System32\notepad.exe</ApplicationFilePath>
13-
<RestartProcess>false</RestartProcess>
13+
<RestartProcess>true</RestartProcess>
1414
</ApplicationItem>
1515
<ApplicationItem>
1616
<DisplayName>ACOdyssey</DisplayName>
0 Bytes
Binary file not shown.

Source/HDRProfile/HDRProfile.csproj

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -114,9 +114,6 @@
114114
<HintPath>..\packages\Hardcodet.NotifyIcon.Wpf.1.0.8\lib\net451\Hardcodet.Wpf.TaskbarNotification.dll</HintPath>
115115
<EmbedInteropTypes>False</EmbedInteropTypes>
116116
</Reference>
117-
<Reference Include="Microsoft.Win32.TaskScheduler, Version=2.9.0.0, Culture=neutral, PublicKeyToken=e25603a88b3aa7da, processorArchitecture=MSIL">
118-
<HintPath>..\packages\TaskScheduler.2.9.0\lib\net452\Microsoft.Win32.TaskScheduler.dll</HintPath>
119-
</Reference>
120117
<Reference Include="System" />
121118
<Reference Include="System.Data" />
122119
<Reference Include="System.Drawing" />

Source/HDRProfile/HDRProfileHandler.cs

Lines changed: 21 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,9 @@ private void Initialize()
100100
return;
101101
Logs.Add("Initializing...", false);
102102
ProcessWatcher = new ProcessWatcher();
103+
ProcessWatcher.OneProcessIsRunningChanged += ProcessWatcher_RunningOrFocusedChanged;
104+
ProcessWatcher.OneProcessIsFocusedChanged += ProcessWatcher_RunningOrFocusedChanged;
105+
103106
HDRController.HDRIsActiveChanged += HDRController_HDRIsActiveChanged;
104107
HDRIsActive = HDRController.HDRIsActive;
105108
LoadSettings();
@@ -109,6 +112,9 @@ private void Initialize()
109112
Initialized = true;
110113
Logs.Add("Initialized", false);
111114
Start();
115+
Logs.Add($"Starting process watcher...", false);
116+
ProcessWatcher.Start();
117+
Logs.Add($"Process watcher started", false);
112118

113119
}
114120
}
@@ -177,7 +183,7 @@ private void LoadSettings()
177183
Logs.LoggingEnabled = Settings.Logging;
178184
foreach (var application in Settings.ApplicationItems)
179185
{
180-
ProcessWatcher.AddProcess(application, false);
186+
ProcessWatcher.AddProcess(application);
181187
application.PropertyChanged += ApplicationItem_PropertyChanged;
182188
}
183189
Logs.Add("Settings loaded", false);
@@ -203,7 +209,7 @@ private void Settings_PropertyChanged(object sender, PropertyChangedEventArgs e)
203209
{
204210
try
205211
{
206-
Tools.SetAutoStartInScheduler(Locale_Texts.HDRProfile, System.Reflection.Assembly.GetEntryAssembly().Location, settings.AutoStart);
212+
Tools.SetAutoStart(Locale_Texts.HDRProfile, System.Reflection.Assembly.GetEntryAssembly().Location, settings.AutoStart);
207213

208214
}
209215
catch (Exception ex)
@@ -264,6 +270,10 @@ private void Closing()
264270

265271
private void Shutdown()
266272
{
273+
Logs.Add($"Stopping process watcher...", false);
274+
ProcessWatcher.OneProcessIsRunningChanged -= ProcessWatcher_RunningOrFocusedChanged;
275+
ProcessWatcher.OneProcessIsFocusedChanged -= ProcessWatcher_RunningOrFocusedChanged;
276+
ProcessWatcher.Stop();
267277
Stop();
268278
TrayMenuHelper.SwitchTrayIcon(false);
269279
Application.Current.Shutdown();
@@ -278,13 +288,8 @@ public void Start()
278288
Logs.Add($"Starting HDR Monitoring...", false);
279289
HDRController.StartMonitoring();
280290
Logs.Add($"HDR Monitoring started", false);
281-
Logs.Add($"Starting process watcher...", false);
282-
ProcessWatcher.OneProcessIsRunningChanged += ProcessWatcher_RunningOrFocusedChanged;
283-
ProcessWatcher.OneProcessIsFocusedChanged += ProcessWatcher_RunningOrFocusedChanged;
284291
Started = true;
285-
ProcessWatcher.Start();
286292
UpdateHDRBasedOnCurrentApplication();
287-
Logs.Add($"Process watcher started", false);
288293

289294
}
290295
}
@@ -298,10 +303,6 @@ public void Stop()
298303
Logs.Add($"Stopping HDR Monitoring...", false);
299304
HDRController.StopMonitoring();
300305
Logs.Add($"HDR Monitoring stopped", false);
301-
Logs.Add($"Stopping process watcher...", false);
302-
ProcessWatcher.OneProcessIsRunningChanged -= ProcessWatcher_RunningOrFocusedChanged;
303-
ProcessWatcher.OneProcessIsFocusedChanged -= ProcessWatcher_RunningOrFocusedChanged;
304-
ProcessWatcher.Stop();
305306
Started = false;
306307
Logs.Add($"Process watcher stopped", false);
307308

@@ -384,6 +385,7 @@ private void RemoveApplication(ApplicationItem process)
384385

385386
private void ProcessWatcher_RunningOrFocusedChanged(object sender, EventArgs e)
386387
{
388+
CurrentApplication = ProcessWatcher.CurrentRunningApplicationItem;
387389
UpdateHDRBasedOnCurrentApplication();
388390

389391
}
@@ -398,15 +400,12 @@ private void UpdateHDRBasedOnCurrentApplication()
398400
switch (Settings.HDRMode)
399401
{
400402
case HDRActivationMode.Running:
401-
CurrentApplication = ProcessWatcher.CurrentRunningApplicationItem;
402403
hdrTargetState = ProcessWatcher.OneProcessIsRunning;
403404
break;
404405
case HDRActivationMode.Focused:
405-
CurrentApplication = ProcessWatcher.CurrentFocusedApplicationItem;
406406
hdrTargetState = ProcessWatcher.OneProcessIsFocused;
407407
break;
408408
default:
409-
CurrentApplication = null;
410409
return;
411410

412411
}
@@ -459,7 +458,15 @@ private void CheckIfRestartIsNecessary(IDictionary<ApplicationItem, ApplicationS
459458
private void RestartProcess(ApplicationItem application)
460459
{
461460
Logs.Add($"Restarting application {application.ApplicationName}", false);
461+
foreach (Process process in Process.GetProcessesByName(application.ApplicationName).ToList())
462+
if (process.StartTime < Process.GetCurrentProcess().StartTime)
463+
{
464+
Logs.Add($"Won't restart application {application.ApplicationName} as it was running before {Locale_Texts.HDRProfile}.", false);
465+
466+
return;
467+
}
462468
Process.GetProcessesByName(application.ApplicationName).ToList().ForEach(p => p.Kill());
469+
463470
Process proc = new Process();
464471
StartApplication(application);
465472
}

Source/HDRProfile/ProcessWatcher.cs

Lines changed: 74 additions & 79 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,14 @@ public class ProcessWatcher
2424
public ApplicationItem CurrentFocusedApplicationItem { get; private set; }
2525

2626
Dictionary<ApplicationItem, ApplicationState> _applications = new Dictionary<ApplicationItem, ApplicationState>();
27-
public IReadOnlyDictionary<ApplicationItem, ApplicationState> Applications => new ReadOnlyDictionary<ApplicationItem, ApplicationState>(_applications);
27+
public IReadOnlyDictionary<ApplicationItem, ApplicationState> Applications
28+
{
29+
get
30+
{
31+
lock (_applicationsLock)
32+
return new ReadOnlyDictionary<ApplicationItem, ApplicationState>(_applications);
33+
}
34+
}
2835

2936
bool _stopRequested = false;
3037
bool _isRunning = false;
@@ -34,17 +41,17 @@ public class ProcessWatcher
3441
public event EventHandler OneProcessIsRunningChanged;
3542
public event EventHandler OneProcessIsFocusedChanged;
3643

37-
ManagementEventWatcher startWatch;
38-
ManagementEventWatcher stopWatch;
44+
//ManagementEventWatcher startWatch;
45+
//ManagementEventWatcher stopWatch;
3946

4047
public ProcessWatcher()
4148
{
42-
startWatch = new ManagementEventWatcher(
43-
new WqlEventQuery("SELECT * FROM Win32_ProcessStartTrace"));
44-
stopWatch = new ManagementEventWatcher(
45-
new WqlEventQuery("SELECT * FROM Win32_ProcessStopTrace"));
46-
startWatch.EventArrived += StartWatch_EventArrived;
47-
stopWatch.EventArrived += StopWatch_EventArrived;
49+
// startWatch = new ManagementEventWatcher(
50+
//new WqlEventQuery("SELECT * FROM Win32_ProcessStartTrace"));
51+
// stopWatch = new ManagementEventWatcher(
52+
//new WqlEventQuery("SELECT * FROM Win32_ProcessStopTrace"));
53+
// startWatch.EventArrived += StartWatch_EventArrived;
54+
// stopWatch.EventArrived += StopWatch_EventArrived;
4855

4956
}
5057

@@ -55,37 +62,37 @@ private void CallNewLog(string logMessage)
5562
}
5663

5764

58-
private void StartWatch_EventArrived(object sender, EventArrivedEventArgs e)
59-
{
60-
lock (_applicationsLock)
61-
{
62-
string applicationName = e.NewEvent.Properties["ProcessName"].Value.ToString().Replace(".exe", "").ToUpperInvariant();
63-
if (_applications.Any(a => a.Key.ApplicationName.ToUpperInvariant().Equals(applicationName)))
64-
{
65-
ApplicationItem application = _applications.First(a => a.Key.ApplicationName.ToUpperInvariant().Equals(applicationName)).Key;
66-
if (_applications[application] == ApplicationState.None)
67-
_applications[application] = ApplicationState.Running;
68-
CallNewLog($"Application startet: {application}");
69-
}
70-
}
71-
}
72-
73-
private void StopWatch_EventArrived(object sender, EventArrivedEventArgs e)
74-
{
75-
76-
lock (_applicationsLock)
77-
{
78-
string applicationName = e.NewEvent.Properties["ProcessName"].Value.ToString().Replace(".exe", "").ToUpperInvariant();
79-
if (_applications.Any(a => a.Key.ApplicationName.ToUpperInvariant().Equals(applicationName)))
80-
{
81-
ApplicationItem application = _applications.First(a => a.Key.ApplicationName.ToUpperInvariant().Equals(applicationName)).Key;
82-
_applications[application] = ApplicationState.None;
83-
CallNewLog($"Application stopped: {application}");
84-
}
85-
}
86-
}
87-
88-
public void AddProcess(ApplicationItem application, bool updateRunningProcesses = true)
65+
//private void StartWatch_EventArrived(object sender, EventArrivedEventArgs e)
66+
//{
67+
// lock (_applicationsLock)
68+
// {
69+
// string applicationName = e.NewEvent.Properties["ProcessName"].Value.ToString().Replace(".exe", "").ToUpperInvariant();
70+
// if (_applications.Any(a => a.Key.ApplicationName.ToUpperInvariant().Equals(applicationName)))
71+
// {
72+
// ApplicationItem application = _applications.First(a => a.Key.ApplicationName.ToUpperInvariant().Equals(applicationName)).Key;
73+
// if (_applications[application] == ApplicationState.None)
74+
// _applications[application] = ApplicationState.Running;
75+
// CallNewLog($"Application startet: {application}");
76+
// }
77+
// }
78+
//}
79+
80+
//private void StopWatch_EventArrived(object sender, EventArrivedEventArgs e)
81+
//{
82+
83+
// lock (_applicationsLock)
84+
// {
85+
// string applicationName = e.NewEvent.Properties["ProcessName"].Value.ToString().Replace(".exe", "").ToUpperInvariant();
86+
// if (_applications.Any(a => a.Key.ApplicationName.ToUpperInvariant().Equals(applicationName)))
87+
// {
88+
// ApplicationItem application = _applications.First(a => a.Key.ApplicationName.ToUpperInvariant().Equals(applicationName)).Key;
89+
// _applications[application] = ApplicationState.None;
90+
// CallNewLog($"Application stopped: {application}");
91+
// }
92+
// }
93+
//}
94+
95+
public void AddProcess(ApplicationItem application)
8996
{
9097
lock (_applicationsLock)
9198
{
@@ -94,8 +101,6 @@ public void AddProcess(ApplicationItem application, bool updateRunningProcesses
94101
_applications.Add(application, ApplicationState.None);
95102
CallNewLog($"Application added to process watcher: {application}");
96103
}
97-
if (updateRunningProcesses)
98-
UpdateRunningProcessesOnce();
99104
}
100105
}
101106

@@ -119,9 +124,8 @@ public void Start()
119124
lock (_accessLock)
120125
{
121126
CallNewLog($"Starting process watcher...");
122-
startWatch.Start();
123-
stopWatch.Start();
124-
UpdateRunningProcessesOnce();
127+
//startWatch.Start();
128+
//stopWatch.Start();
125129
_isRunning = true;
126130
_watchProcessThread = new Thread(WatchProcessLoop);
127131
_watchProcessThread.IsBackground = true;
@@ -137,9 +141,8 @@ public void Stop()
137141
lock (_accessLock)
138142
{
139143
CallNewLog($"Stopping process watcher...");
140-
startWatch.Stop();
141-
stopWatch.Stop();
142-
144+
//startWatch.Stop();
145+
//stopWatch.Stop();
143146
_stopRequested = true;
144147
_watchProcessThread.Join();
145148
_stopRequested = false;
@@ -149,36 +152,6 @@ public void Stop()
149152
}
150153
}
151154

152-
153-
private void UpdateRunningProcessesOnce()
154-
{
155-
lock (_applicationsLock)
156-
{
157-
CallNewLog($"Looking for running applications on start...");
158-
159-
Process[] processes = Process.GetProcesses();
160-
161-
List<ApplicationItem> applications = _applications.Select(a => a.Key).ToList();
162-
foreach (ApplicationItem application in applications)
163-
{
164-
_applications[application] = ApplicationState.None;
165-
foreach (var process in processes.Select(p => p.ProcessName))
166-
{
167-
if (process.ToUpperInvariant() == application.ApplicationName.ToUpperInvariant())
168-
{
169-
_applications[application] = ApplicationState.Running;
170-
CurrentRunningApplicationItem = application;
171-
CallNewLog($"Application is running: {application}");
172-
}
173-
}
174-
}
175-
CallNewLog($"No application is running.");
176-
177-
CurrentRunningApplicationItem = null;
178-
}
179-
}
180-
181-
182155
private void WatchProcessLoop()
183156
{
184157
while (!_stopRequested)
@@ -207,11 +180,33 @@ private void WatchProcessLoop()
207180
}
208181
}
209182

210-
183+
211184

212185

213186
private bool GetIsOneProcessRunning()
214187
{
188+
189+
lock (_applicationsLock)
190+
{
191+
192+
Process[] processes = Process.GetProcesses();
193+
194+
List<ApplicationItem> applications = _applications.Select(a => a.Key).ToList();
195+
foreach (ApplicationItem application in applications)
196+
{
197+
_applications[application] = ApplicationState.None;
198+
foreach (var process in processes.Select(p => p.ProcessName))
199+
{
200+
if (process.ToUpperInvariant() == application.ApplicationName.ToUpperInvariant())
201+
{
202+
_applications[application] = ApplicationState.Running;
203+
CurrentRunningApplicationItem = application;
204+
}
205+
}
206+
}
207+
CurrentRunningApplicationItem = null;
208+
}
209+
215210
if (_applications.Any(a => a.Value != ApplicationState.None))
216211
{
217212
var application = _applications.First(a => a.Value != ApplicationState.None);

Source/HDRProfile/Properties/AssemblyInfo.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,5 +52,5 @@
5252
// Sie können alle Werte angeben oder Standardwerte für die Build- und Revisionsnummern verwenden,
5353
// indem Sie "*" wie unten gezeigt eingeben:
5454
// [assembly: AssemblyVersion("1.0.*")]
55-
[assembly: AssemblyVersion("1.5.2.0")]
56-
[assembly: AssemblyFileVersion("1.5.2.0")]
55+
[assembly: AssemblyVersion("1.5.3.0")]
56+
[assembly: AssemblyFileVersion("1.5.3.0")]

0 commit comments

Comments
 (0)