我已经写了一个简单的类来创建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
这样,为什么?。