-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathProgram.cs
132 lines (117 loc) · 4.49 KB
/
Program.cs
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
using System;
using System.Management;
using System.Threading;
using Microsoft.Win32;
namespace PowerModeChangedListener
{
public static class Program
{
private static readonly object Locker = new();
private static readonly ManagementEventWatcher EventWatcher = new() { Query = new WqlEventQuery("Win32_PowerManagementEvent") };
public static void Main()
{
Start();
Wait();
Stop();
ClearConsoleBuffer();
PressAnyKeyToContinue();
}
private static void Start()
{
SystemEvents.PowerModeChanged += SystemEventsOnPowerModeChanged;
SystemEvents.EventsThreadShutdown += SystemEventsOnEventsThreadShutdown;
SystemEvents.SessionEnded += SystemEventsOnSessionEnded;
SystemEvents.SessionSwitch += SystemEventsOnSessionSwitch;
EventWatcher.EventArrived += EventWatcherOnEventArrived;
EventWatcher.Start();
Console.CancelKeyPress += ConsoleOnCancelKeyPress;
TimeStampedPrint("Event listeners started");
}
private static void Wait()
{
lock (Locker)
{
Monitor.Wait(Locker);
}
}
private static void Stop()
{
EventWatcher.Stop();
Console.CancelKeyPress -= ConsoleOnCancelKeyPress;
EventWatcher.EventArrived -= EventWatcherOnEventArrived;
SystemEvents.SessionSwitch -= SystemEventsOnSessionSwitch;
SystemEvents.SessionEnded -= SystemEventsOnSessionEnded;
SystemEvents.EventsThreadShutdown -= SystemEventsOnEventsThreadShutdown;
SystemEvents.PowerModeChanged -= SystemEventsOnPowerModeChanged;
TimeStampedPrint("Event listeners stopped");
}
private static void ClearConsoleBuffer()
{
while (Console.KeyAvailable)
{
Console.ReadKey(true);
}
}
private static void PressAnyKeyToContinue()
{
Console.Write("\nPress any key to continue . . . ");
Console.ReadKey(true);
}
private static void SystemEventsOnPowerModeChanged(object sender, PowerModeChangedEventArgs e)
{
TimeStampedPrint("SystemEvents.PowerModeChanged: {0}", e.Mode);
}
private static void SystemEventsOnEventsThreadShutdown(object sender, EventArgs eventArgs)
{
TimeStampedPrint("SystemEvents.EventsThreadShutdown");
}
private static void SystemEventsOnSessionEnded(object sender, SessionEndedEventArgs e)
{
TimeStampedPrint("SystemEvents.SessionEnded: {0}", e.Reason);
}
private static void SystemEventsOnSessionSwitch(object sender, SessionSwitchEventArgs e)
{
TimeStampedPrint("SystemEvents.SessionSwitch: {0}", e.Reason);
}
private static void EventWatcherOnEventArrived(object sender, EventArrivedEventArgs e)
{
var eventType = Convert.ToInt32(e.NewEvent.Properties["EventType"].Value);
switch (eventType)
{
case 4:
TimeStampedPrint("Win32_PowerManagementEvent: Entering Suspend");
break;
case 7:
TimeStampedPrint("Win32_PowerManagementEvent: Resume From Suspend");
break;
case 10:
TimeStampedPrint("Win32_PowerManagementEvent: Power Status Change");
break;
case 11:
TimeStampedPrint("Win32_PowerManagementEvent: OEM Event");
break;
case 18:
TimeStampedPrint("Win32_PowerManagementEvent: Resume Automatic");
break;
default:
TimeStampedPrint("Win32_PowerManagementEvent: {0}", eventType);
break;
}
}
private static void ConsoleOnCancelKeyPress(object sender, ConsoleCancelEventArgs e)
{
if (e.SpecialKey == ConsoleSpecialKey.ControlC)
{
e.Cancel = true;
}
lock (Locker)
{
Monitor.Pulse(Locker);
}
}
private static void TimeStampedPrint(string format, params object[] args)
{
Console.WriteLine("{0:HH:mm:ss:fff} {1}", DateTime.Now, string.Format(format, args));
}
}
}