SystemEvents.PowerModeChanged不会引发Resume事件

man*_*cze 6 .net vb.net resume systemevent

我有一个WinForms应用程序,可以在系统进入暂停状态(睡眠)和恢复时跟踪.App将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
Run Code Online (Sandbox Code Playgroud)

应用程序中始终存在一个现有表单.但是,它可以在通知区域中最小化或隐藏.还有一些参考实际的实例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.
Run Code Online (Sandbox Code Playgroud)

我从日志中注意到的是,第一次实际上有了Resume事件.另一件事是在大约20分钟的时间间隔内调用了暂停.它可能是某种"计算机只是部分唤醒,而实际上没有打开显示器左右,并让应用程序处理他们需要的任何东西/网络通知等等,而不是再次入睡"的东西?

Dar*_*rom 1

150% 同意 Hans 的观点,不喜欢使用 Windows 电源管理。您最好的选择可能是创建一个始终运行的轻型服务,并在启动备份时通知您的软件;已经有一段时间了,但我相信服务一旦再次开始运行、启动、暂停等时就可以触发事件......

您可以将两者结合起来,并在记录系统挂起日志之前确认睡眠是服务停止的原因。然后使用服务启动/恢复事件重新打开所有内容。您可以将日志记录逻辑放入您的服务中,具体取决于使用此数据的其他内容。

以下是来自 msdn 的 on continue 事件信息:https://msdn.microsoft.com/en-us/library/system.serviceprocess.servicebase.onContinue (v=vs.110).aspx