返回

C# 中检测用户闲置状态:如何获取上次交互时间?

windows

## 检测用户闲置状态:在 C# 中检索用户上次与操作系统的交互时间

问题陈述

假设你正在开发一款托盘应用程序,需要判断用户何时处于闲置状态。为此,你必须获取用户上次与操作系统交互的时间。

解决方案

Windows 操作系统会跟踪用户上次交互的时间,你可以通过 GetLastInputInfo Windows API 检索此信息。

实现步骤

1. 导入必要的命名空间:

using System.Runtime.InteropServices;

2. 定义 GetLastInputInfo 结构:

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

3. 定义 LASTINPUTINFO 结构体:

public struct LASTINPUTINFO
{
    public uint cbSize;
    public uint dwTime;
}

4. 获取上次交互时间:

LASTINPUTINFO lastInputInfo = new LASTINPUTINFO();
lastInputInfo.cbSize = (uint)Marshal.SizeOf(typeof(LASTINPUTINFO));
GetLastInputInfo(ref lastInputInfo);
long idleTime = Environment.TickCount - lastInputInfo.dwTime;

代码示例

using System;
using System.Runtime.InteropServices;

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

    public struct LASTINPUTINFO
    {
        public uint cbSize;
        public uint dwTime;
    }

    static void Main(string[] args)
    {
        LASTINPUTINFO lastInputInfo = new LASTINPUTINFO();
        lastInputInfo.cbSize = (uint)Marshal.SizeOf(typeof(LASTINPUTINFO));
        GetLastInputInfo(ref lastInputInfo);
        long idleTime = Environment.TickCount - lastInputInfo.dwTime;

        Console.WriteLine("User has been idle for {0} milliseconds.", idleTime);
    }
}

结论

通过使用 GetLastInputInfo 函数,你可以准确确定用户上次与计算机交互的时间。这对于创建检测用户闲置状态的应用程序非常有用,例如屏幕保护程序或电源管理工具。

常见问题解答

  • Q1:此方法是否适用于所有 Windows 版本?
    A:是的,GetLastInputInfo 函数可在所有 Windows 版本中使用。

  • Q2:精度如何?
    A:精度取决于操作系统使用的时钟,通常为毫秒级。

  • Q3:我可以在多线程应用程序中使用它吗?
    A:是的,但建议使用互斥或其他同步机制来防止并发访问。

  • Q4:是否可以检测到鼠标移动和键盘输入?
    A:是的,此方法可以检测到任何形式的用户输入,包括鼠标移动和键盘输入。

  • Q5:是否存在替代方法?
    A:是的,还有其他方法可以检测用户闲置状态,例如使用基于事件的监听器或轮询活动计时器。然而,GetLastInputInfo 通常被认为是更简单和更准确的方法。