获取计算机的最后唤醒时间

时间:2012-07-24 08:58:02

标签: .net windows

我知道我可以使用Environment.TickCount来获取自上次启动以来的时间 但是有可能最后一次计算从休眠或睡眠状态中醒来吗?

(请不要使用WMI)

3 个答案:

答案 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.SystemEventsPowerModeChanged 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

您肯定要添加一些错误检查,但这应该可以实现您想要的功能。