如何以编程方式检测操作系统(Windows)何时醒来或要睡觉

背景

我的儿子喜欢用他的笔记本电脑时,他不应该,我只是想,如果我能写一个应用程序,当他打开/closures他的笔记本电脑给我发电子邮件会很方便。

(我甚至会满足于在机器上有networkingstream量时通知我的东西)

如何以编程方式检测操作系统正在醒来还是要睡觉? 我发现这个链接从这个相关的职位 。 但是,这涵盖了OS X.我正在为Windows 7寻找同样的东西。

(如果可能的话,我想用Java来做到这一点,但是我会selectC#/ C ++)

最简单的方法是不写任何代码,尽管这是堆栈溢出。 单击开始,键入计划并选择计划任务。 设置一个(单击创建任务),并设置一个触发器,当机器被解锁。 对于该行动,有没有给你发电子邮件。

新的触发器新的行动

重复启动和用户登录时,如果你想。 完成。

你将要创建一个窗口,并观察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(); } 

一个非常简单的,也许简单而有效的方法可能是让计时器每分钟发一个计时器。 如果计时器触发并且自上次执行以来已经过了5分钟的实时时间,那么您可能会认为计算机正在睡眠,因为您的线程不可能被安排这么久。

另一个原因可能是时钟调整,如DST或手动更改,但在您的情况下,这种“噪音”应该是非常低的。

您可以编写一个简单的应用程序,并将其注册为Windows服务,以便在系统启动时自动启动。 这个应用程序可以做任何你想要的,当它开始。 如果它是一个合适的Windows应用程序,它可以注册以获得关于即将关闭系统的通知(我不记得细节,但是我在多年前在C ++ MFC应用程序中实现了这一点)。

如果你更喜欢Java,你可以通过像Tanuki这样的合适的服务包来注册你的应用程序(看起来他们有一个免费的社区许可证选项)。 虽然这可能是矫枉过正。 当系统关闭时,可能会收到有关JVM关闭的通知(但我没有具体的经验)。

http://www.pinvoke.net/default.aspx/powrprof.CallNtPowerInformation – 检查链接。 它几乎所有的Windows功能win32api。 您可以直接在Windows 7笔记本电脑上调用电源管理功能。 为此创建一个Windows服务,这将使用这些特定的API来通知机器状态。