C#-检测上一次用户与操作系统交互的时间


72

我正在编写一个小型任务栏应用程序,该应用程序需要检测用户上次与计算机交互的时间,以确定他们是否空闲。

是否有任何方法可以检索用户上一次移动鼠标,敲击键或与计算机进行任何交互的时间?

我认为Windows很明显会对此进行跟踪,以确定何时显示屏幕保护程序或关闭电源等,因此我假设有一个Windows API可以自己检索此屏幕?

Answers:



49

包括以下名称空间

using System;
using System.Runtime.InteropServices;

然后包括以下内容

internal struct LASTINPUTINFO 
{
    public uint cbSize;

    public uint dwTime;
}

/// <summary>
/// Helps to find the idle time, (in milliseconds) spent since the last user input
/// </summary>
public class IdleTimeFinder
{
    [DllImport("User32.dll")]
    private static extern bool GetLastInputInfo(ref LASTINPUTINFO plii);        

    [DllImport("Kernel32.dll")]
    private static extern uint GetLastError();

    public static uint GetIdleTime()
    {
        LASTINPUTINFO lastInPut = new LASTINPUTINFO();
        lastInPut.cbSize = (uint)System.Runtime.InteropServices.Marshal.SizeOf(lastInPut);
        GetLastInputInfo(ref lastInPut);

        return ((uint)Environment.TickCount - lastInPut.dwTime);
    }
/// <summary>
/// Get the Last input time in milliseconds
/// </summary>
/// <returns></returns>
    public static long GetLastInputTime()
    {
        LASTINPUTINFO lastInPut = new LASTINPUTINFO();
        lastInPut.cbSize = (uint)System.Runtime.InteropServices.Marshal.SizeOf(lastInPut);
        if (!GetLastInputInfo(ref lastInPut))
        {
            throw new Exception(GetLastError().ToString());
        }       
        return lastInPut.dwTime;
    }
}

要将滴答数转换为时间,您可以使用

TimeSpan timespent = TimeSpan.FromMilliseconds(ticks);

注意。该例程使用术语TickCount,但是值以毫秒为单位,因此与Ticks不同。

来自MSDN上有关Environment.TickCount的文章

获取自系统启动以来经过的毫秒数。


19
您获得的空闲时间以毫秒为单位,而不是滴答声。
kennyzx 2012年

1
正如kennyzx提到的获得时间跨度的正确方法是 TimeSpan timespent = TimeSpan.FromMilliseconds(ticks);
Petr

当我创建一个类时,我无法从该类中获取任何对象来设置值,您能否在实例化该类后发布一个示例,说明如何使用该对象?
Bbb

0

码:

 using System;
 using System.Runtime.InteropServices;

 public static int IdleTime() //In seconds
    {
        LASTINPUTINFO lastinputinfo = new LASTINPUTINFO();
        lastinputinfo.cbSize = Marshal.SizeOf(lastinputinfo);
        GetLastInputInfo(ref lastinputinfo);
        return (((Environment.TickCount & int.MaxValue) - (lastinputinfo.dwTime & int.MaxValue)) & int.MaxValue) / 1000;
    }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.