Приложение не вызывает событие Microsoft.Win32.SystemEvents.PowerModeChanged
Я написал простой класс для создания абстракции Microsoft.Win32.SystemEvents.PowerModeChanged
событие, это соответствующий код:
Imports Microsoft.Win32
Public Class PowerStateMonitor
Private ReadOnly events As EventHandlerList
Public Custom Event SuspendInitiated As EventHandler(Of EventArgs)
AddHandler(ByVal value As EventHandler(Of EventArgs))
Me.events.AddHandler("SuspendInitiatedEvent", value)
End AddHandler
RemoveHandler(ByVal value As EventHandler(Of EventArgs))
Me.events.RemoveHandler("SuspendInitiatedEvent", value)
End RemoveHandler
RaiseEvent(ByVal sender As Object, ByVal e As EventArgs)
Dim handler As EventHandler(Of EventArgs) =
DirectCast(Me.events("SuspendInitiatedEvent"),
EventHandler(Of EventArgs))
If (handler IsNot Nothing) Then
handler.Invoke(sender, e)
End If
End RaiseEvent
End Event
Public Custom Event SuspendResumed As EventHandler(Of EventArgs)
AddHandler(ByVal value As EventHandler(Of EventArgs))
Me.events.AddHandler("SuspendResumedEvent", value)
End AddHandler
RemoveHandler(ByVal value As EventHandler(Of EventArgs))
Me.events.RemoveHandler("SuspendResumedEvent", value)
End RemoveHandler
RaiseEvent(ByVal sender As Object, ByVal e As EventArgs)
Dim handler As EventHandler(Of EventArgs) =
DirectCast(Me.events("SuspendResumedEvent"),
EventHandler(Of EventArgs))
If (handler IsNot Nothing) Then
handler.Invoke(sender, e)
End If
End RaiseEvent
End Event
Public Sub New()
Me.events = New EventHandlerList
End Sub
Public Overridable Sub Start()
AddHandler SystemEvents.PowerModeChanged, AddressOf Me.SystemEvents_PowerModeChanged
End Sub
Protected Overridable Sub OnSuspendInitiatedEvent(ByVal e As EventArgs)
RaiseEvent SuspendInitiated(Me, e)
End Sub
Protected Overridable Sub OnSuspendResumedEvent(ByVal e As EventArgs)
RaiseEvent SuspendResumed(Me, e)
End Sub
Private Sub SystemEvents_PowerModeChanged(ByVal sender As Object,
ByVal e As PowerModeChangedEventArgs)
Select Case e.Mode
Case PowerModes.Suspend
Me.OnSuspendInitiatedEvent(Nothing)
Case PowerModes.Resume
Me.OnSuspendResumedEvent(Nothing)
End Select
End Sub
End Class
Проблема в том, что когда я звоню System.Windows.Forms.Application.SetSuspendState
чтобы приостановить или перевести систему в спящий режим, SuspendInitiated
Событие моего класса не поднято. Я пытаюсь получить уведомление о состоянии приостановки с помощью этого кода ниже, но ничего не происходит, потому что значение PowerModeChangedEventArgs.PowerModes
собственность никогда не бывает PowerModes.Suspend
так что мое событие никогда не поднимается.
Friend WithEvents PowerStateMon As New PowerStateMonitor
Public Sub Suspend(Optional ByVal force As Boolean = False)
Application.SetSuspendState(PowerState.Suspend, force:=force, disableWakeEvent:=True)
End Sub
Private Sub PowerStateMon_SuspendInitiated(ByVal sender As Object, ByVal e As EventArgs) _
Handles PowerStateMon.SuspendInitiated
' Application.Exit()
Process.Start("CMD.exe", "/K Echo %TIME% The system is entering in Suspend state.")
End Sub
Тем не менее, другое событие моего класса, SuspendResumed
надлежащим образом уведомляет меня, когда я возобновляю состояние Suspend:
Private Sub PowerStateMon_SuspendResumed(ByVal sender As Object, ByVal e As EventArgs) _
Handles PowerStateMon.SuspendResumed
Process.Start("CMD.exe", "/K Echo %TIME% The system resumed from Suspend state.")
End Sub
Обратите внимание, что документы MSDN гласят:
Однако, как только приложение отвечает на запрос приостановки, оно может занять любое время, необходимое для очистки ресурсов и закрытия активных процессов.
Что мне не хватает?
ОБНОВИТЬ
Я заметил, что если я приостанавливаю систему в обычном режиме, я имею в виду из меню запуска Windows, я получаю уведомление о приостановке, но если я использую System.Windows.Forms.Application.SetSuspendState
Метод я не уведомлен, так как я сказал значение PowerModeChangedEventArgs.PowerModes
собственность никогда не бывает PowerModes.Suspend
так почему?