如何以编程方式检测操作系统(Windows)何时唤醒或进入睡眠状态

gMa*_*ale 4 c# java windows windows-7

背景

我的儿子喜欢在他不应该使用他的笔记本电脑时,我只是觉得如果我能写一个应用程序,只要他打开/关闭他的笔记本电脑就会给我发电子邮件,这会很方便.

(我甚至会满足于在机器上有网络流量时通知我的事情)

如何以编程方式检测操作系统何时唤醒或进入睡眠状态?我发现这个链接这个相关的职位.但这涵盖了OS X.我正在为Windows 7寻找相同的东西.

(如果可能的话,我想用Java做这个,但我会选择C#/ C++)

Kat*_*ory 7

最简单的方法是不写任何代码,即使这是堆栈溢出.单击开始,键入计划,然后选择计划任务.设置一个(单击"创建任务")并在机器解锁时设置触发器.对于Action,请让它给您发送电子邮件.

新的触发器 新行动

如果需要,重复启动和用户登录时.完成.


Joe*_*dan 5

您将要创建一个窗口并观察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


Emm*_*uel 5

我搜索了很长时间,发现这是最好的方法,“睡眠”事件以前从未工作过:

 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)