我知道我可以使用Environment.TickCount
来获取自上次启动以来的时间
但是有可能最后一次计算从休眠或睡眠状态中醒来吗?
(请不要使用WMI)
答案 0 :(得分:7)
尝试此命令 - 使用Process将其关闭 - 您需要解析结果
cmd / k wevtutil qe系统 / Q: “* [系统[提供商[@名称= 'Microsoft的Windows的开机故障诊断']]” / rd:true / c:1 / f:text
如果您想要更多信息,请从here解除...
答案 1 :(得分:0)
根据this page,如果你想知道用户是否是唤醒的“原因”,你必须听PBT_APMRESUMEAUTOMATIC(和PBT_APMRESUMESUSPEND。
我认为Microsoft.Win32.SystemEvents(PowerModeChanged event)是值得关注的地方,但如果不进一步调查,可能会有some issues。
This page可能会让你开始感兴趣。
答案 2 :(得分:0)
尽管上面有一个提供核心查询的答案,但是对于那些认为自己想要更完整的东西的人来说,这是一个更加充实的解决方案。
private string getLastWakeInfo() {
String args = @"qe System /q:"" *[System[Provider[@Name = 'Microsoft-Windows-Power-Troubleshooter']]]"" /rd:true /c:1 /f:xml";
ProcessStartInfo psi = new ProcessStartInfo();
psi.FileName = "wevtutil.exe";
psi.UseShellExecute = false;
psi.CreateNoWindow = true;
psi.RedirectStandardOutput = true;
psi.RedirectStandardError = true;
psi.RedirectStandardInput = true;
psi.Arguments = args;
Process proc = Process.Start(psi);
proc.WaitForExit(2000);
String strOutput = proc.StandardOutput.ReadToEnd();
return strOutput;
}
用法:
private void button1_Click_2(object sender, EventArgs e) {
String xml = getLastWakeInfo();
XmlDocument doc = new XmlDocument();
doc.LoadXml(xml);
String path = "//*[local-name()='Event']/*[local-name()='EventData']/*[local-name()='Data'][@Name='WakeTime']";
XmlNode root = doc.DocumentElement;
XmlNode node = root.SelectSingleNode(path);
MessageBox.Show(node.InnerText);
}
将需要以下内容;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Xml;
using System.Windows.Forms; // Needed only if you want to show the messagebox
在此示例中,我试图找到PC的唤醒时间(如@Name='WakeTime'
中所列-更改该值以获取唤醒时间或查询返回的另一个单独的值)。例如,如果您想知道什么唤醒了PC,请改用WakeSourceText
。
您肯定要添加一些错误检查,但这应该可以实现您想要的功能。