最简单的方法是不写任何代码,即使这是堆栈溢出.单击开始,键入计划,然后选择计划任务.设置一个(单击"创建任务")并在机器解锁时设置触发器.对于Action,请让它给您发送电子邮件.
如果需要,重复启动和用户登录时.完成.
您将要创建一个窗口并观察WM_POWERBROADCAST消息(http://msdn.microsoft.com/en-us/library/aa373248%28v=vs.85%29.aspx)并检查wParam你想要的行动.例如,当系统即将进入挂起状态(即关闭笔记本电脑)时,窗口应该收到带有PBT_APMSUSPEND的WM_POWERBROADCAST作为wParam.恢复似乎有几个不同的wParam值:PBT_APMRESUMESUSPEND,PBT_APMRESUMECRITICAL和PBT_APMRESUMEAUTOMATIC
我搜索了很长时间,发现这是最好的方法,“睡眠”事件以前从未工作过:
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();
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
5349 次 |
最近记录: |