应用程序不提高Microsoft.Win32.SystemEvents.PowerModeChanged事件

时间:2015-11-05 17:18:07

标签: .net vb.net events suspend hibernation

我已经写了一个简单的类来创建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事件不会被引发。我尝试使用下面的代码通知Suspend状态,但没有任何反应,因为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的其他事件正确通知我:

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 startmenu,我已经通知了Suspend,但是如果我使用System.Windows.Forms.Application.SetSuspendState方法我不是通知,正如我所说,PowerModeChangedEventArgs.PowerModes属性的值永远不会PowerModes.Suspend这样,为什么?。

0 个答案:

没有答案