如何用C#实现无键盘输入触发的10分钟AFK计时器?
C# AFK计时器实现方案
针对你需要实现「10分钟无键盘输入时输出AFK提示,之后每隔10分钟输出一次」的需求,先分析你现有代码的核心问题,再给出完整的修正方案:
现有代码的问题
CheckIfPlayerAFK逻辑完全错误:直接判断常量AfkTimeUntilKick >=10(永远成立),导致程序启动就输出AFK提示,完全没有检测用户输入- 缺少键盘输入跟踪:没有记录用户最后一次输入的时间,无法判断是否真正处于AFK状态
- 计时器配置错误:设置了1秒的触发间隔,不符合10分钟检测的需求
- 程序入口缺失:没有明确的
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); } } }
关键说明
- 输入检测:通过Windows API的
GetLastInputInfo获取用户最后一次输入的时间,能准确检测所有键盘输入(不限于控制台窗口) - 计时器配置:设置为10分钟触发一次,每次触发时检查是否满足AFK条件
- 语法错误解决:通过明确的
Program类和Main方法作为程序入口,避免顶级语句位置错误的问题 - AFK提示逻辑:每次计时器触发时,若用户已10分钟无输入,就输出提示,实现「每隔10分钟输出一次」的需求
内容的提问来源于stack exchange,提问作者Astrox9966
相关产品推荐
相关产品推荐

