我需要检测系统电源状态模式.确切地说,我需要一个事件,当Windows 7从睡眠中醒来时会激活.我已经在使用:
SystemEvents.PowerModeChanged += SystemEvents_PowerModeChanged;
Run Code Online (Sandbox Code Playgroud)
但是这个事件的问题在于它被提升了四次:可能是在计算机进入睡眠模式和计算机唤醒之后.我想要一个只在计算机唤醒时引发的事件.这有什么事吗?
我在用
SystemEvents.PowerModeChanged += new PowerModeChangedEventHandler(
SystemEvents_PowerModeChanged
);
Run Code Online (Sandbox Code Playgroud)
判断Windows何时挂起.但我怎么知道它是进入休眠还是暂停?
是否有.Net或PInvoke方法来执行此操作?
我的应用程序需要阻止睡眠/休眠模式.我已经有了代码,但在成功捕获WM_POWERBROADCAST消息后,PBT_APMQUERYSUSPEND和PBT_APMQUERYSTANDBY都未成功捕获.有趣的是,PBT_APMRESUMECRITICAL和PBT_APMRESUMEAUTOMATIC消息都被我的应用程序捕获.
底线问题:我的应用程序无法捕获备用/暂停消息,但成功捕获恢复消息是否有任何原因?
这个Q&A [stackoverflow.com]有帮助,顺便说一下,但是这些消息似乎没有进入我的应用程序.
我的代码(为了简洁起见删除了事件日志代码):
protected override void WndProc(ref System.Windows.Forms.Message m)
{
// Power status event triggered
if (m.Msg == (int)NativeMethods.WindowMessage.WM_POWERBROADCAST)
{
// Machine is trying to enter suspended state
if (m.WParam.ToInt32() == (int)NativeMethods.WindowMessage.PBT_APMQUERYSUSPEND ||
m.WParam.ToInt32() == (int)NativeMethods.WindowMessage.PBT_APMQUERYSTANDBY)
{
// Have perms to deny this message?
if((m.LParam.ToInt32() & 0x1) != 0)
{
// If so, deny broadcast message
m.Result = new IntPtr((int)NativeMethods.WindowMessage.BROADCAST_QUERY_DENY);
}
}
return; // ?! …Run Code Online (Sandbox Code Playgroud)