Как указано выше, вы можете использовать WMI для перехвата событий.
Я добавляю пример кода, который написал несколько лет назад (надеюсь, он все еще будет работать, так как он был написан на VS2010 с .Net3.5)
Вот класс, который собирает все события
Imports Microsoft.Win32
Imports System.Windows.Forms
Public Class PowerMessageFilter
Implements IMessageFilter
Const WM_POWERBROADCAST As Integer = &H218
Const PBT_APMSUSPEND As Integer = &H4
Const PBT_APMSTANDBY As Integer = &H5
Const PBT_APMRESUMESUSPEND As Integer = &H7
Const PBT_APMRESUMESTANDBY As Integer = &H8
Protected Sub reportpowerchange(ByVal reason As Integer)
Dim report As String = String.Empty
Select Case (reason)
Case PBT_APMSUSPEND
report = "system is suspending operation "
suspend_service()
Exit Select
Case PBT_APMSTANDBY
report = "system is standing by "
suspend_service()
Exit Select
Case PBT_APMRESUMESUSPEND
report = "operation resuming after suspension."
suspend_service()
Exit Select
Case PBT_APMRESUMESTANDBY
report = "operation resuming after stand by."
suspend_service()
Exit Select
End Select
End Sub
Public Function PreFilterMessage(ByRef m As Message) As Boolean Implements IMessageFilter.PreFilterMessage
If WM_POWERBROADCAST = m.Msg Then
Console.Out.WriteLine("Power Broadcast recieved.")
Dim reason As Integer = m.WParam.ToInt32()
reportpowerchange(reason)
End If
Return False
End Function
Private Sub suspend_service()
' Your suspend code
End Sub
End Class
Теперь для слушателя у меня была служба Win32, которая работала в фоновом режиме и выполняла работу по прослушиванию
Dim Filter As New PowerMessageFilter 'The Standby/Hibernation Filter catch;
Application.AddMessageFilter(Filter)
Извините, что у меня нет ссылок на сайты, с которых я привел примеры, наверное, это было из ссылок MSDN выше.
Надеюсь, это поможет,
Liron