【发布时间】:2010-11-14 03:00:32
【问题描述】:
我正在开发一个 C# WPF 应用程序,该应用程序将在一台装有 APC 1500 UPS 的 Windows 7 机器上运行。在断电时,我需要应用程序在 Windows 7 将其关闭之前响应某些关闭活动。
我可以直接处理 Windows 事件还是需要与 APC 软件交互?如果是 Windows,会发生什么事件?任何链接或信息将不胜感激 - 我在搜索时没有看到太多。
谢谢。
【问题讨论】:
标签: c#
我正在开发一个 C# WPF 应用程序,该应用程序将在一台装有 APC 1500 UPS 的 Windows 7 机器上运行。在断电时,我需要应用程序在 Windows 7 将其关闭之前响应某些关闭活动。
我可以直接处理 Windows 事件还是需要与 APC 软件交互?如果是 Windows,会发生什么事件?任何链接或信息将不胜感激 - 我在搜索时没有看到太多。
谢谢。
【问题讨论】:
标签: c#
也许这会有所帮助?
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();
}
【讨论】:
您可以尝试简单地捕获 WM_QUERYENDSESSION。 MSDN有一些good example code for this。
据我了解,在 Windows Vista/7 中,不再可能无限期地延迟关机或挂起。但是,我确实相信系统会在结束之前给您的流程合理的时间来做事。 (有人,如果我在这一点上错了,请纠正我。)
请注意,这只在关闭时对您有所帮助。如果您需要有关 UPS 本身的通知和管理信息,那么我不确定如何添加。
【讨论】: