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

Python实现Windows用户空闲时长统计及前后端对接求助

解决方案

一、统计总空闲时长

原代码仅能获取当前瞬时空闲时长,要统计累计总空闲时长,需要跟踪用户状态切换(活跃→空闲、空闲→活跃),并记录每段空闲的起始/结束时间来累加。

实现思路:

  • 设定一个空闲判定阈值(比如5秒,避免短暂离开误统计)
  • 维护两个状态变量:is_idle(当前是否处于空闲状态)、total_idle(累计总空闲时长,单位秒)
  • 定时检查空闲时长,当连续空闲超过阈值且未处于空闲状态时,记录空闲开始时间;当用户回到活跃状态时,计算这段空闲时长并累加到总时长。

修改后的代码示例:

import sys
import time

if sys.platform == 'win32':
    from ctypes import *
    
    class LASTINPUTINFO(Structure):
        _fields_ = [
            ('cbSize', c_uint),
            ('dwTime', c_int),
        ]
        
    def get_idle_duration():
        lastInputInfo = LASTINPUTINFO()
        lastInputInfo.cbSize = sizeof(lastInputInfo)
        if windll.user32.GetLastInputInfo(byref(lastInputInfo)):
            millis = windll.kernel32.GetTickCount() - lastInputInfo.dwTime
            return millis / 1000.0
        else:
            return 0
else:
    def get_idle_duration():
        return 0

# 空闲统计核心逻辑
def track_idle_time():
    total_idle = 0.0  # 累计总空闲时长(秒)
    is_idle = False
    idle_start_time = 0.0
    IDLE_THRESHOLD = 5  # 连续空闲5秒才判定为空闲状态

    while True:
        current_idle = get_idle_duration()
        if current_idle >= IDLE_THRESHOLD:
            if not is_idle:
                # 进入空闲状态,记录开始时间
                is_idle = True
                idle_start_time = time.time()
        else:
            if is_idle:
                # 从空闲回到活跃,计算这段空闲时长并累加
                is_idle = False
                idle_duration = time.time() - idle_start_time
                total_idle += idle_duration
                print(f"累计空闲时长:{total_idle/3600:.2f} 小时")
        
        time.sleep(1)  # 每秒检查一次

if __name__ == '__main__':
    track_idle_time()

二、构建数据对象

需要将任务跟踪数据与空闲数据整合,设计统一的数据结构,方便存储和前端展示。

推荐数据结构(可扩展):

from dataclasses import dataclass
from datetime import datetime
from typing import List, Optional

# 任务跟踪数据对象
@dataclass
class TaskRecord:
    task_id: str
    task_name: str
    start_time: datetime
    end_time: Optional[datetime]
    duration: float  # 任务耗时(秒)

# 空闲时段数据对象
@dataclass
class IdleRecord:
    idle_id: str
    start_time: datetime
    end_time: datetime
    duration: float  # 单段空闲时长(秒)

# 每日统计汇总
@dataclass
class DailySummary:
    date: str
    total_task_duration: float
    total_idle_duration: float
    task_records: List[TaskRecord]
    idle_records: List[IdleRecord]

持久化存储:

  • 用SQLite数据库创建对应表结构,关联任务和日期;
  • 或用JSON文件定期存储记录,适合小型应用快速开发。

三、搭建API对接前端

用轻量的Flask/FastAPI搭建RESTful API,将统计数据暴露给前端。

Flask示例(简单易上手):

from flask import Flask, jsonify
from datetime import datetime

app = Flask(__name__)

# 模拟存储的统计数据(实际从数据库/JSON读取)
mock_summary = {
    "date": datetime.today().strftime("%Y-%m-%d"),
    "total_task_duration": 7200.0,  # 2小时
    "total_idle_duration": 3600.0,  # 1小时
    "task_records": [
        {"task_id": "t1", "task_name": "代码开发", "start_time": "2024-05-20 09:00:00", "end_time": "2024-05-20 10:00:00", "duration": 3600.0}
    ],
    "idle_records": [
        {"idle_id": "i1", "start_time": "2024-05-20 10:00:00", "end_time": "2024-05-20 11:00:00", "duration": 3600.0}
    ]
}

# 获取当日统计数据接口
@app.route('/api/daily-summary', methods=['GET'])
def get_daily_summary():
    return jsonify(mock_summary)

# 获取累计总空闲时长接口
@app.route('/api/total-idle', methods=['GET'])
def get_total_idle():
    # 实际从汇总数据计算或读取
    return jsonify({"total_idle_hours": mock_summary["total_idle_duration"]/3600})

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)

前端可以通过AJAX/Fetch调用这些接口,将数据渲染成图表或列表展示。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 17:01:07