如何在C#桌面应用程序中查找计算机空闲时间(空闲时间)

5

如何在C#桌面应用程序中查找计算机空闲时间(空闲时间)

空闲时间是计算机或设备已通电但未被使用的总时间。如果计算机或计算机设备闲置一段时间,它可能会进入待机模式或关闭电源。

是否有任何方法可以获取这个信息?


3
IDLE是一种Python集成开发环境(IDE),它包含了一个交互式解释器和编辑器,可用于编写、测试和调试Python代码。 - Nahum
空闲时间是计算机或设备通电但未使用的总时间。如果计算机或计算机设备空闲一段时间,它可能会进入待机模式或关机。 - MD TAHMID HOSSAIN
1
http://www.codeproject.com/Articles/13384/Getting-the-user-idle-time-with-C - zey
2个回答

11

如果你所说的空闲是指自上次用户输入以来经过的时间(就像 GetIdleTime() 函数所做的那样),则必须使用GetlastInputInfo()函数(请参见MSDN):

在C#中,您需要使用P / Invoke:

[DllImport("user32.dll")]
static extern bool GetLastInputInfo(ref LASTINPUTINFO plii);

[StructLayout(LayoutKind.Sequential)]
struct LASTINPUTINFO {
    public uint cbSize;
    public int dwTime;
}

它会返回上一次用户输入后经过的毫秒数。你需要的第一件事是系统启动时间,你可以通过Environment.TickCount(从启动时开始计算的毫秒数)获得:

DateTime bootTime = DateTime.UtcNow.AddMilliseconds(-Environment.TickCount);
现在您可以获得上次输入的时间:
LASTINPUTINFO lii = new LASTINPUTINFO();
lii.cbSize = (uint)Marshal.SizeOf(typeof(LASTINPUTINFO));
GetLastInputInfo(ref lii);

DateTime lastInputTime = bootTime.AddMilliseconds(lii.dwTime);

经过计算,经过的时间将会是:

TimeSpan idleTime = DateTime.UtcNow.Subtract(lastInputTime);

虽然这种方法相当不错,但需要注意的是它并不是100%准确的。如果您在30秒的时间段内运行轮询lastInputTime的代码,您会发现报告的毫秒值慢慢地向未来漂移。这可能不是一个大问题,但值得注意。 - Jostein Kjønigsen
@JosteinKjønigsen 的准确度大约为50毫秒(由于低分辨率时间测量而导致的时间片),那么您可以将idleTime舍入到前一秒(左右),但我非常惊讶会出现漂移!好发现!!! - Adriano Repetti

-1

应用程序的空闲状态并不等同于系统的空闲状态(即使这个术语在这里有点被误用了)。在应用程序层面上,它意味着没有其他任务需要处理(不仅限于用户输入)。而在系统层面上,它意味着用户没有与系统进行交互。 - Adriano Repetti

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接