背景
我的儿子喜欢在不应该使用他的笔记本电脑时,我只是觉得如果我能写一个应用程序,只要他打开/关闭他的笔记本电脑就会给我发电子邮件,这会很方便。
(我甚至会满足于在机器上有网络流量时通知我的事情)
问题
如何以编程方式检测操作系统何时唤醒或进入睡眠状态?我从this link找到了this related post。但这涵盖了OS X.我正在为Windows 7寻找相同的东西。
(如果可能的话,我想用Java做这个,但我会选择C#/ C ++)
答案 0 :(得分:7)
最简单的方法是不写任何代码,即使这是堆栈溢出。单击开始,键入计划,然后选择计划任务。设置一个(单击“创建任务”)并在机器解锁时设置触发器。对于Action,请让它给您发送电子邮件。
重复启动以及用户登录时(如果需要)。完成。
答案 1 :(得分: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
答案 2 :(得分:3)
我搜索了很长时间,发现这是最好的方式,'睡眠'事件以前从未工作过:
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 :(得分:1)
一个非常简单,也许粗糙但有效的方法可能是让计时器每分钟都有一个计时器。如果计时器触发并且比如上次执行后的5分钟实时,那么您可能会认为计算机正在睡眠,因为您的线程不太可能无法安排这么长时间。
差异的另一个原因可能是时钟调整,如DST或手动更改,但在您的场景中,这种“噪音”应该非常低。
答案 4 :(得分:0)
您可以编写一个简单的应用程序并将其注册为Windows服务,以便在系统启动时自动启动。这个应用程序可以在它启动时做任何你想做的事情。如果它是一个合适的Windows应用程序,它可以注册以获得有关即将发生的系统关闭的通知(我不记得详细信息,但我多年前在C ++ MFC应用程序中实现了这一点)。
如果您更喜欢Java,您可以通过合适的服务包装器Tanuki将您的应用注册为服务(似乎他们有免费的社区许可选项)。虽然这可能有点过头了。并且可能可以在系统关闭时获得关于JVM关闭的通知(但我对此没有具体经验)。
答案 5 :(得分:0)
http://www.pinvoke.net/default.aspx/powrprof.CallNtPowerInformation - 查看链接。它几乎都具有所有windows功能的win32api。您可以直接在Windows 7笔记本电脑中调用电源管理功能。为此创建一个Windows服务,它将使用这些特定的api来通知机器状态。