我正在写一个桌面应用程序,想知道是否有任何事件在交流电源状态发生变化时触发。
发布于 2009-06-21 12:12:50
当电源设置发生变化时,Windows会向窗口发送一个事件。这是WM_POWERBROADCAST和它的wParam PBT_POWERSETTINGCHANGE。如果需要,您可以按照Noldorin的建议,在收到此事件池SystemInformation.PowerStatus之后。
发布于 2009-06-21 11:08:46
我不相信BCL中有任何东西会引发这样的变化。考虑到这种状态更新的频率很低,你真的需要一个吗?
我会简单地以固定的时间间隔(即一些秒数)轮询SystemInformation.PowerStatus属性。然后,如果您愿意,可以基于此引发一个事件。
发布于 2012-02-06 20:26:10
我搜索了很长一段时间,发现这是最好的方法,“睡眠”-事件从来没有工作过
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();
}https://stackoverflow.com/questions/1023671
复制相似问题