Windows 7中的断电事件... C#问题[重复]
Posted
技术标签:
【中文标题】Windows 7中的断电事件... C#问题[重复]【英文标题】:Power loss events in Windows 7...C# question [duplicate] 【发布时间】:2010-11-14 03:00:32 【问题描述】:我正在开发一个 C# WPF 应用程序,该应用程序将在一台装有 APC 1500 UPS 的 Windows 7 机器上运行。在断电时,我需要应用程序在 Windows 7 将其关闭之前响应某些关闭活动。
我可以直接处理 Windows 事件还是需要与 APC 软件交互?如果是 Windows,会发生什么事件?任何链接或信息将不胜感激 - 我在搜索时没有看到太多。
谢谢。
【问题讨论】:
【参考方案1】:也许这会有所帮助?
private ManagementEventWatcher managementEventWatcher;
private readonly Dictionary<string, string> powerValues = new Dictionary<string, string>
"4", "Entering Suspend",
"7", "Resume from Suspend",
"10", "Power Status Change",
"11", "OEM Event",
"18", "Resume Automatic"
;
public void InitPowerEvents()
var q = new WqlEventQuery();
var scope = new ManagementScope("root\\CIMV2");
q.EventClassName = "Win32_PowerManagementEvent";
managementEventWatcher = new ManagementEventWatcher(scope, q);
managementEventWatcher.EventArrived += PowerEventArrive;
managementEventWatcher.Start();
private void PowerEventArrive(object sender, EventArrivedEventArgs e)
foreach (PropertyData pd in e.NewEvent.Properties)
if (pd == null || pd.Value == null) continue;
var name = powerValues.ContainsKey(pd.Value.ToString())
? powerValues[pd.Value.ToString()]
: pd.Value.ToString();
Console.WriteLine("PowerEvent:"+name);
public void Stop()
managementEventWatcher.Stop();
【讨论】:
【参考方案2】:您可以尝试简单地捕获 WM_QUERYENDSESSION。 MSDN有一些good example code for this。
据我了解,在 Windows Vista/7 中,不再可能无限期地延迟关机或挂起。但是,我确实相信系统会在结束之前给您的流程合理的时间来做事。 (有人,如果我在这一点上错了,请纠正我。)
请注意,这只在关闭时对您有所帮助。如果您需要有关 UPS 本身的通知和管理信息,那么我不确定如何添加。
【讨论】:
在 Win7 中,如果进程耗时过长,用户可以选择强制关闭进程,因此您应该始终将响应此事件而保存的数据视为不可靠的。 @slugster,知道用户需要多长时间才能获得此选项? 我不知道确切的时间,我只知道必须使用该功能。如果用户不执行该选项,则 Win7 将继续等待,尽管我不确定如果某些东西真正挂起,它会等待多长时间,而不是只需要一段时间。以上是关于Windows 7中的断电事件... C#问题[重复]的主要内容,如果未能解决你的问题,请参考以下文章