我有一个WinForms应用程序,可以在系统进入暂停状态(睡眠状态)和恢复时跟踪。应用程序使用SystemEvents
类来实现此目的。它在我的机器上工作正常。但是,对于某些用户来说,似乎并不总是提出PowerModes.Resume
的事件。应用程序收到多个PowerModes.Suspend
,其间没有任何PowerModes.Resume
,这很奇怪。
我的主要问题是如何可能发生这种情况以及如何避免它并使恢复检测可靠?
代码非常简单,基本上遵循(非常简短):
Imports Microsoft.Win32
Friend Class TehClass
Implements IDisposable
Private Sub New()
AddHandler SystemEvents.PowerModeChanged, AddressOf Me.System_PowerModeChanged
End Sub
Private Sub System_PowerModeChanged(sender As Object, args As PowerModeChangedEventArgs)
Log.Info("Power mode changed: {0}.", args.Mode)
End Sub
#Region "IDisposable Support"
' just dropping handler there
#End Region
End Class
应用程序中始终存在一个表单。但是,它可以在通知区域中最小化或隐藏。此外,还会引用TehClass
的实际实例。
这是示例日志:
[2015-09-15 22:38:38,501] Power mode changed: Suspend.
[2015-09-16 07:10:31,106] Power mode changed: Resume.
[2015-09-16 08:54:21,112] Power mode changed: Suspend.
[2015-09-16 09:14:36,252] Power mode changed: Suspend.
[2015-09-16 09:35:21,077] Power mode changed: Suspend.
[2015-09-16 09:55:36,085] Power mode changed: Suspend.
[2015-09-16 10:15:50.122] User reported this log therefore the PC had to be in Working (Resumed) state.
我从日志中注意到,实际上第一次引发了Resume事件。另一件事是在大约20分钟的时间间隔内调用了暂停。它可能是某种“计算机只是部分唤醒而没有实际打开显示器等,并让应用程序处理他们需要的任何东西/网络通知等等,而不是再次入睡”?
答案 0 :(得分:1)
同意Hans 150%,而不是使用Windows电源管理的粉丝。您最好的选择可能是创建一个随时运行的轻量级服务,并在软件启动时通知您;它已经有一段时间但我相信服务可以在它们再次开始运行时,在启动,暂停等时触发事件......
您可以混合使用两者并确认睡眠是服务在进行任何系统暂停日志之前停止的原因。然后使用服务启动/恢复事件重新打开所有内容。您可以将记录逻辑放入您的服务中,具体取决于使用此数据的其他内容。
以下是来自msdn:https://msdn.microsoft.com/en-us/library/system.serviceprocess.servicebase.oncontinue(v=vs.110).aspx
的on continue事件信息