Приложение не вызывает событие 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 так почему?

0 ответов

Другие вопросы по тегам