SystemEvents.PowerModeChanged不提高恢复事件
我有一个WinForms应用程序,当系统进入挂起状态(睡眠)和恢复时保持跟踪。 App为此使用SystemEvents
类。它在我的机器上正常工作。然而,对于某些用户来说,PowerModes.Resume
的事件似乎并不总是会引发。应用程序收到多个PowerModes.Suspend
而没有任何PowerModes.Resume
之间,这是奇怪的。SystemEvents.PowerModeChanged不提高恢复事件
我的主要问题是如何可能发生,以及如何避免它,使恢复检测可靠?
的代码是非常简单和基本以下(非常缩短):
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.
我从日志注意的是,这里居然有人提出首次恢复事件。另一件事是暂停被调用大约20分钟的时间间隔。它可能是某种“电脑只是部分唤醒而没有实际上打开显示器,让应用程序处理任何他们需要/网络通知等等,而不是再次进入睡眠”的东西?
同意Hans 150%,不是使用Windows电源管理的粉丝。您最好的选择可能是创建一个随时运行的轻型服务,并在软件启动时通知您的软件;它已经有一段时间了,但我相信服务可以在启动,暂停等时再次开始运行时触发事件...
您可以将两者混合并确认睡眠是服务停止的原因在做任何系统暂停日志之前。然后使用服务启动/恢复事件重新打开一切。您可能可能会将日志逻辑放入您的服务中,具体取决于还有哪些使用此数据。
这里是上继续从MSDN事件信息:https://msdn.microsoft.com/en-us/library/system.serviceprocess.servicebase.oncontinue(v=vs.110).aspx
我明白你是什么意思,但这似乎对我的情况来说真的是过火了。此外,这种方法似乎引入了一些更多的陷阱 - 应用程序对服务的依赖性,服务运行的保证,安装服务所需的权限,用户手动禁用服务,...是的,我提到我需要可靠的检测,但不是糟糕:)。虽然在这里有想法是很好的,因为它可能对别人有帮助。 – mancze
电源管理是Windows的最不可靠的部件之一。许多机器制造商都使用完全相同的硬件和操作系统,只有自己的BIOS和电源方案才能将他们的机器与其他机器区分开来。错误嘉豪,不要依赖它。 –
这就是为什么我们有.NET,不是吗?好吧,希望放在一边。所以这不奇怪,以上发生?这真的很糟糕,因为我的应用程序在PC休眠期间暂停了它的一些功能,我需要它恢复正常。什么是预期的解决方法?轮询? – mancze
@mancze我会尝试创建一个轻量级的后台线程,检查系统是否每隔1秒/分钟/小时运行...无论什么是需要的,如果系统正在运行,但软件仍在睡眠,然后唤醒它向上。 – Max