You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用C#实现无键盘输入触发的10分钟AFK计时器?

C# AFK计时器实现方案

针对你需要实现「10分钟无键盘输入时输出AFK提示,之后每隔10分钟输出一次」的需求,先分析你现有代码的核心问题,再给出完整的修正方案:

现有代码的问题

  1. CheckIfPlayerAFK逻辑完全错误:直接判断常量AfkTimeUntilKick >=10(永远成立),导致程序启动就输出AFK提示,完全没有检测用户输入
  2. 缺少键盘输入跟踪:没有记录用户最后一次输入的时间,无法判断是否真正处于AFK状态
  3. 计时器配置错误:设置了1秒的触发间隔,不符合10分钟检测的需求
  4. 程序入口缺失:没有明确的Main方法,若添加了顶级执行代码,会触发「顶级语句必须在命名空间和类型声明之前」的语法错误

完整修正代码

using System;
using System.Timers;
using System.Runtime.InteropServices;

// 调用Windows API所需的结构体
[StructLayout(LayoutKind.Sequential)]
struct LASTINPUTINFO
{
    public uint cbSize;
    public uint dwTime;
}

class PlayerStats
{
    private Timer _afkTimer;
    private const int _afkThresholdMinutes = 10;
    private const int _timerIntervalMinutes = 10;
    public bool IsAFK { get; private set; }

    public PlayerStats()
    {
        // 初始化计时器:间隔10分钟(转换为毫秒)
        _afkTimer = new Timer(_timerIntervalMinutes * 60 * 1000);
        _afkTimer.Elapsed += OnAfkTimerElapsed;
        _afkTimer.AutoReset = true;
        _afkTimer.Start();
    }

    // 调用Windows API获取最后一次用户输入的时间(系统启动后的毫秒数)
    [DllImport("user32.dll")]
    private static extern bool GetLastInputInfo(ref LASTINPUTINFO plii);

    private uint GetLastInputTimestamp()
    {
        LASTINPUTINFO inputInfo = new LASTINPUTINFO();
        inputInfo.cbSize = (uint)Marshal.SizeOf(inputInfo);
        GetLastInputInfo(ref inputInfo);
        return inputInfo.dwTime;
    }

    // 检查是否达到AFK阈值
    private void CheckAfkStatus()
    {
        uint lastInputTime = GetLastInputTimestamp();
        uint elapsedMs = (uint)Environment.TickCount - lastInputTime;
        int elapsedMinutes = (int)(elapsedMs / 60000);

        // 若超过10分钟无输入,输出提示(每隔10分钟触发一次)
        if (elapsedMinutes >= _afkThresholdMinutes)
        {
            Console.WriteLine("Player Is AFK!");
            IsAFK = true;
        }
        else
        {
            IsAFK = false;
        }
    }

    private void OnAfkTimerElapsed(object sender, ElapsedEventArgs e)
    {
        CheckAfkStatus();
    }
}

// 程序入口(解决顶级语句错误)
class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("AFK计时器已启动,按任意键退出...");
        PlayerStats player = new PlayerStats();

        // 保持程序运行,监听键盘输入
        while (!Console.KeyAvailable)
        {
            System.Threading.Thread.Sleep(100);
        }
    }
}

关键说明

  1. 输入检测:通过Windows API的GetLastInputInfo获取用户最后一次输入的时间,能准确检测所有键盘输入(不限于控制台窗口)
  2. 计时器配置:设置为10分钟触发一次,每次触发时检查是否满足AFK条件
  3. 语法错误解决:通过明确的Program类和Main方法作为程序入口,避免顶级语句位置错误的问题
  4. AFK提示逻辑:每次计时器触发时,若用户已10分钟无输入,就输出提示,实现「每隔10分钟输出一次」的需求

内容的提问来源于stack exchange,提问作者Astrox9966

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 15:56:03