C#交流电源已连接/已断开事件

时间:2009-06-21 11:05:36

标签: c# events

我正在编写一个桌面应用程序,想知道是否有任何事件在AC电源状态发生变化时被触发。

4 个答案:

答案 0 :(得分:2)

当电源设置发生变化时,Windows会向窗口发送一个事件。它是WM_POWERBROADCAST及其wParam PBT_POWERSETTINGCHANGE。如果需要,您可以在收到Noldorin建议的事件池SystemInformation.PowerStatus之后。

答案 1 :(得分:1)

我不相信BCL中有任何事情可以引发关于这种变化的事件。考虑到这种状态更新的频率很低,你真的需要一个吗?

我只是定期轮询SystemInformation.PowerStatus属性(即几秒钟)。如果愿意,您可以根据此事件举起活动。

答案 2 :(得分:0)

我搜索了很长时间,发现这是最好的方式,'睡眠'事件以前从未工作

 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();
    }

答案 3 :(得分:0)

最简单的方法是连接到Microsoft.Win32.SystemEvents.PowerModeChanged。 但是,您需要查看SystemInformation.PowerStatus值以确定更改的内容。