【问题标题】:Power loss events in Windows 7...C# question [duplicate]Windows 7中的断电事件... C#问题[重复]
【发布时间】:2010-11-14 03:00:32
【问题描述】:

我正在开发一个 C# WPF 应用程序,该应用程序将在一台装有 APC 1500 UPS 的 Windows 7 机器上运行。在断电时,我需要应用程序在 Windows 7 将其关闭之前响应某些关闭活动。

我可以直接处理 Windows 事件还是需要与 APC 软件交互?如果是 Windows,会发生什么事件?任何链接或信息将不胜感激 - 我在搜索时没有看到太多。

谢谢。

【问题讨论】:

    标签: c#


    【解决方案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 将继续等待,尽管我不确定如果某些东西真正挂起,它会等待多长时间,而不是只需要一段时间。
      猜你喜欢
      • 2011-01-02
      • 2012-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-15
      • 2019-10-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多