1. 项目概述:键盘鼠标使用统计工具
这个开源小工具的核心功能是记录用户每天的键盘敲击次数和鼠标点击次数,并将数据存储到本地SQLite数据库中。作为一名长期伏案工作的程序员,我最初开发这个工具是为了量化自己的操作习惯——想知道每天到底按了多少次键盘、点击了多少次鼠标。没想到这个小工具后来在开发者社区获得了不少关注,很多同行用它来评估工作效率、分析操作习惯甚至预防职业病。
工具采用轻量级架构设计,后台服务仅占用约3MB内存,完全不影响系统性能。数据记录精确到毫秒级,支持按日/周/月维度统计,还能生成简单的趋势图表。所有数据都存储在本地,不存在隐私泄露风险,这也是很多用户选择它的重要原因。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 技术实现方案解析
2.1 系统架构设计
整个工具采用三层架构:
- 采集层:通过系统钩子捕获键盘和鼠标事件
- 处理层:对原始事件进行过滤和聚合
- 存储层:使用SQLite持久化统计数据
这种设计保证了各模块的独立性,比如可以轻松替换存储引擎而不影响其他模块。我选择C#开发主要是考虑到Windows平台下系统API调用的便利性,而且C#的内存管理能有效避免资源泄漏问题。
2.2 关键技术实现
键盘事件捕获:
csharp复制private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam)
{
if (nCode >= 0 && wParam == (IntPtr)WM_KEYDOWN)
{
int vkCode = Marshal.ReadInt32(lParam);
// 记录按键到数据库
}
return CallNextHookEx(_hookID, nCode, wParam, lParam);
}
鼠标事件处理:
csharp复制private void MouseHookProc(int nCode, IntPtr wParam, IntPtr lParam)
{
if (nCode >= 0)
{
switch ((int)wParam)
{
case WM_LBUTTONDOWN:
case WM_RBUTTONDOWN:
// 记录点击事件
break;
}
}
}
数据库设计:
sql复制CREATE TABLE key_stats (
id INTEGER PRIMARY KEY AUTOINCREMENT,
key_code INTEGER NOT NULL,
press_time DATETIME NOT NULL
);
CREATE TABLE mouse_stats (
id INTEGER PRIMARY KEY AUTOINCREMENT,
button_type INTEGER NOT NULL,
click_time DATETIME NOT NULL
);
3. 安装与使用指南
3.1 环境准备
- Windows 7及以上系统
- .NET Framework 4.7.2
- 约10MB磁盘空间
3.2 安装步骤
- 从GitHub下载最新release包
- 解压到任意目录
- 运行KeyMouseCounter.exe
- 系统托盘会出现图标,右键可查看统计
注意:首次运行时会自动创建数据库文件,请确保有写入权限
3.3 数据查看方式
工具提供三种数据查看方式:
- 实时悬浮窗:显示当日按键/点击总数
- 每日报告:右键菜单生成HTML格式报告
- 原始数据导出:可导出CSV供进一步分析
4. 高级功能与自定义
4.1 过滤规则配置
在config.json中可以设置需要忽略的按键或区域:
json复制{
"keyboard": {
"ignore_keys": [91, 92] // 忽略Win键
},
"mouse": {
"ignore_regions": [
{"x1":0, "y1":0, "x2":100, "y2":100} // 忽略左上角100x100区域
]
}
}
4.2 数据可视化
使用内置的Python脚本可以生成更丰富的图表:
python复制import sqlite3
import matplotlib.pyplot as plt
conn = sqlite3.connect('stats.db')
cursor = conn.cursor()
# 查询最近7天数据
cursor.execute("""
SELECT date(press_time), COUNT(*)
FROM key_stats
GROUP BY date(press_time)
ORDER BY date(press_time) DESC
LIMIT 7
""")
5. 常见问题与解决方案
5.1 数据准确性验证
Q:如何确认统计结果准确?
A:可以:
- 使用键盘测试网站对照计数
- 进行已知次数的点击测试
- 检查数据库原始记录
5.2 性能优化建议
当数据量较大时(超过100万条记录),建议:
- 定期归档历史数据
- 对数据库进行VACUUM操作
- 关闭实时悬浮窗显示
5.3 隐私保护措施
工具默认不会记录:
- 具体的按键内容(只记录按键事件)
- 鼠标移动轨迹
- 任何窗口或程序信息
6. 开发经验分享
在开发过程中有几个关键发现值得分享:
-
系统钩子的稳定性:最初使用低级钩子时发现某些游戏会导致钩子失效,后来改用全局钩子并添加了自动恢复机制。
-
数据库写入优化:直接记录每个事件会导致大量IO操作,最终采用内存缓冲+定时刷新的策略,将磁盘写入频率控制在每分钟一次。
-
跨版本兼容性:不同Windows版本的系统API有细微差异,特别是对某些特殊按键的处理方式不同,需要做版本检测和适配。
这个项目虽然不大,但让我深刻体会到即使是简单工具也需要考虑很多实际使用场景。比如有用户反馈在远程桌面环境下统计异常,排查发现是因为远程会话中的事件传递机制不同,最终通过检测会话类型做了特殊处理。
