获取Windows系统的活跃运行时长(Active Uptime)
统计Windows设备实际活跃使用时长
你之前用PerformanceCounter获取的系统运行时长(Uptime)是从上次重启到现在的总时长,包含休眠、待机等非活跃状态,没法区分实际使用时间。要统计实际活跃时长,可以试试下面几种方法:
方法1:用GetLastInputInfoAPI跟踪用户输入
这个API能获取系统最后一次收到用户输入(键盘/鼠标)的时间,结合当前时间就能算出空闲时长,进而统计活跃时间。示例代码:
using System; using System.Runtime.InteropServices; public static class ActiveUsageTracker { [StructLayout(LayoutKind.Sequential)] private struct LASTINPUTINFO { public uint cbSize; public uint dwTime; } [DllImport("user32.dll")] private static extern bool GetLastInputInfo(ref LASTINPUTINFO plii); public static TimeSpan GetIdleTime() { LASTINPUTINFO lastInputInfo = new LASTINPUTINFO(); lastInputInfo.cbSize = (uint)Marshal.SizeOf(lastInputInfo); GetLastInputInfo(ref lastInputInfo); uint idleTime = (uint)Environment.TickCount - lastInputInfo.dwTime; return TimeSpan.FromMilliseconds(idleTime); } // 定时调用GetIdleTime记录空闲时长,用总运行时长减去累计空闲时长得到活跃时长 public static TimeSpan GetActiveUsageTime(TimeSpan totalUptime, TimeSpan accumulatedIdle) { return totalUptime - accumulatedIdle; } }
方法2:通过Windows事件日志统计会话状态
Windows系统会记录登录、注销、休眠、唤醒等事件,你可以查询这些事件来计算活跃时间段:
- 登录事件ID:4624(安全日志)
- 注销事件ID:4634(安全日志)
- 休眠事件ID:1074(系统日志,备注含"sleep")
- 唤醒事件ID:1(系统日志,来源为Power-Troubleshooter)
解析这些事件的时间戳,累加登录到休眠/注销之间的时长,就能得到实际活跃使用时间。
方法3:使用WMI查询用户会话状态
通过WMI的Win32_Desktop类可以获取当前用户会话的创建时间,结合当前时间计算活跃时长。示例代码:
using System.Management; public static TimeSpan GetSessionActiveTime() { TimeSpan activeTime = TimeSpan.Zero; ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_Desktop"); foreach (ManagementObject obj in searcher.Get()) { DateTime createTime = ManagementDateTimeConverter.ToDateTime(obj["CreationDate"].ToString()); activeTime = DateTime.Now - createTime; } return activeTime; }
注:这种方法仅统计当前会话的活跃时长,用户注销后重新登录需要重新统计。
内容的提问来源于stack exchange,提问作者Nathan
相关产品推荐
相关产品推荐

