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

.NET午夜运行睡眠提醒应用:开发选型与用户活动检测问询

问题解答

1. 定时任务的技术选型推荐

.NET Worker Service(优先推荐,针对.NET技术栈)

如果你熟悉.NET生态,Worker Service是非常合适的选择:它是微软官方推出的长期后台服务框架,内置托管服务、日志系统、依赖注入等成熟特性,Windows下可直接注册为Windows Service,Linux下能打包成systemd服务,完全满足“设备始终运行”的需求,稳定性和安全性有保障,后续维护也方便。

其他可选方案

  • 系统原生任务计划程序:如果仅需“午夜后定时检查并提醒”,不需要后台进程持续运行,直接用Windows任务计划程序(或Linux的cron、Mac的Launchd)更轻量。只需配置触发器(比如每天0点后每30分钟执行一次),指定要运行的检查脚本或程序即可,无需开发完整服务,系统原生支持,权限可控。
  • Python + APScheduler:如果追求开发效率或跨平台支持,用Python配合APScheduler调度库是不错的选择。APScheduler支持多种定时规则,通过nssm(Windows)或systemd(Linux)可把Python脚本注册为后台服务,灵活度高,代码编写快。
  • Electron:如果提醒需要带交互UI(比如自定义弹窗、设置界面),Electron能帮你快速开发跨平台桌面应用,内置定时器功能,同时可配置为后台运行,兼顾功能和用户体验。

2. 用户活动验证的简单通用方案

你之前考虑的检查任务管理器服务的方案过于复杂,推荐直接利用系统提供的用户输入检测能力,以下是几种简单通用的方式:

Windows平台:调用系统API

使用GetLastInputInfo API,这是Windows原生提供的获取用户最后输入(鼠标/键盘操作)时间的接口,计算当前时间与最后输入时间的差值,就能判断用户是否处于空闲状态。如果用.NET开发,可以通过P/Invoke快速调用:

using System;
using System.Runtime.InteropServices;

public static class UserActivityChecker
{
    [StructLayout(LayoutKind.Sequential)]
    private struct LASTINPUTINFO
    {
        public uint cbSize;
        public uint dwTime;
    }

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

    public static TimeSpan GetIdleTime()
    {
        var lastInputInfo = new LASTINPUTINFO();
        lastInputInfo.cbSize = (uint)Marshal.SizeOf(lastInputInfo);
        GetLastInputInfo(ref lastInputInfo);
        return TimeSpan.FromMilliseconds(Environment.TickCount - lastInputInfo.dwTime);
    }
}

跨平台方案:使用第三方库

用pynput库(Python)可以监听鼠标、键盘事件,实时记录用户最后活动时间,支持Windows、Linux、Mac全平台,代码简洁:

from pynput import mouse, keyboard
import time

last_activity_time = time.time()

def update_last_activity():
    global last_activity_time
    last_activity_time = time.time()

# 启动监听
mouse_listener = mouse.Listener(on_move=update_last_activity, on_click=update_last_activity)
keyboard_listener = keyboard.Listener(on_press=update_last_activity)
mouse_listener.start()
keyboard_listener.start()

# 定时检查空闲状态
while True:
    idle_duration = time.time() - last_activity_time
    if idle_duration > 300:  # 检测到5分钟空闲
        print("用户已空闲,触发睡觉提醒")
    time.sleep(60)  # 每分钟检查一次

轻量方案:执行系统命令

Windows下可以直接执行query user命令,命令输出会包含当前用户的会话空闲时间,解析输出结果即可,无需编写复杂的API调用代码:

query user

输出示例中会有类似Idle Time的字段,提取数值就能判断用户是否活跃。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.11 22:46:01