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#问题[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何根据Windows Phone 7中的参数值在按钮中传递参数并获取后面代码中的值以重定向到另一页?

在 Windows 7 事件日志中,啥是“源”?

Windows 7 中的 C# dll 问题

C#任务栏中的Windows 7进度条?

C# - 实时控制台输出重定向

从 C# 重命名网页