Skip to content
YiGalaxyPublic

About

Windows native typing counter with persistent charts, an animated edge widget and input speed history. C++20 / SQLite / mcpp.

Topics

Resources

Contributing

Stars

0 stars

Watchers

0 watching

Forks

Repository files navigation

KeyCount · 每日输入统计

用 C++20 编写的 Windows 原生桌面程序,统计日常有效输入按键,并通过 SQLite 保存历史。无需浏览器、联网服务、Qt 或额外运行时。

支持 Windows 10/11 x64 · C++20 · MIT 开源 · CMake / mcpp 双构建

更新日志 · 参与贡献与发布流程 · 许可证

界面示例(演示数据,不会写入你的数据库)

桌面悬浮窗与 +1 特效示例

贴边收起时 +1 从侧边飘出(演示效果)

输入速度趋势与分钟明细(演示数据,不会写入真实数据库)

直接使用

从本仓库的 Releases 页面下载最新 Windows x64 ZIP,解压后运行 KeyCount.exe。CMake 和 mcpp 发布包功能相同,任选一个即可;无需安装 Visual Studio。支持 Windows 10/11 x64。

本地构建发布包为 dist/KeyCount-<版本号>-Windows-x64.zip 或 dist/KeyCount-<版本号>-mcpp-Windows-x64.zip。GitHub Release 附 SHA256SUMS.txt,可通过 PowerShell Get-FileHash <ZIP路径> -Algorithm SHA256 校验。

  • 顶部实时显示今日、近 7 天、近 30 天日均和累计输入次数,约每秒更新。
  • 图表切换最近 7 / 30 / 90 个日历日;移动鼠标到柱状图上查看当天计数。
  • 活跃热力图显示最近 98 天,每列连续 7 天,最新一天位于右下角,颜色深浅相对于该范围内的最高值。
  • 小时分布显示当天 0–23 时的输入节奏。
  • “明细”查看全部每日历史,缺失日期显示为 0;“导出 CSV”导出全部每日数据,可用 Excel 打开。
  • “输入速度”打开独立窗口:实时速度、所选日期的分钟峰值和活跃分钟均速,附分钟趋势曲线、分钟明细和速度 CSV 导出。可选择历史日期,鼠标移到曲线上查看对应分钟。
  • “暂停统计”随时停止采集;暂停状态会保存,下次运行保持暂停。
  • 桌面右侧默认显示置顶悬浮窗,实时显示今日计数,不抢占输入焦点。按住拖动调整位置,松开后记住位置;双击打开完整图表,右键打开设置。
  • 悬浮窗靠近屏幕左侧或右侧时自动收为窄标签;鼠标移上去展开,移开约 400 毫秒后收起。拖到屏幕内部可恢复普通悬浮窗。位置和贴边方向会记住。
  • 展开的悬浮窗同时显示最近 60 秒的输入速度;收起时,独立的“+1”从屏幕边缘向内飘出。
  • 每记录一次有效输入,从悬浮窗向上弹出一个独立的“+1”,280 毫秒内上飘并淡出;快速输入时允许叠加,透明特效层不会挡住鼠标操作。
  • “设置 / 托盘 / 悬浮窗右键 → 显示桌面悬浮窗 / 输入时弹出 +1 特效”可单独开关;开关和悬浮窗位置会保留到下次启动。Windows 关闭界面动画时,+1 改为原地淡出。
  • 点击窗口关闭按钮后继续在系统托盘运行。托盘图标单击打开面板,右键菜单中的“保存并退出”完全退出。
  • “设置 → 开机启动”可选择登录时在后台启动,默认关闭。启用后请保持 EXE 路径不变;移动前先关闭开机启动,再从新路径启用。
  • 重复打开程序会显示现有窗口,不会启动多个采集器。
  • Tab 在按钮之间移动,空格操作焦点按钮;明细窗口可用方向键浏览,Esc 关闭。

统计口径

按你选定的“有效输入按键次数”统计,次数不等于最终汉字数或文章字数。

输入行为 处理
字母、数字、空格、标点、数字键盘数字和运算键 每次物理按下计 1 次
Shift + 字母 / 标点 计入字母或标点,Shift 自身不计
中文拼音输入 每个符合规则的按键都计入,包括选字数字键及空格
Ctrl / Alt / Win 组合键(包括 AltGr) 不计入
退格、删除、回车、Tab、方向键、功能键、鼠标 不计入
长按键盘产生的系统自动重复 只计首次按下
程序模拟输入 / SendInput 不计入
粘贴、语音输入、手写及屏幕键盘产生的最终文本 不统计最终字符数

全局监听当前用户交互会话的键盘事件,适用于常见编辑器、浏览器、聊天窗口等。只有运行期间能采集,不能补录运行前的输入;系统锁屏、安全桌面、部分提升权限或拦截钩子的应用可能无法计数。程序默认以普通用户权限运行。

持久化与隐私

数据库固定在 %LOCALAPPDATA%\KeyCount\keycount.db,通常为 C:\Users\你的用户名\AppData\Local\KeyCount\keycount.db。“设置 → 打开数据目录”可以直接找到它。移动 EXE 不会移动或清除数据。

只保存本机日历日期、小时、分钟、累计次数,以及暂停和悬浮窗设置;不保存实际字符、按键序列、窗口标题或应用名,不发送统计数据到网络。键码只用于内存中的过滤与长按判定。

速度单位为有效按键次数/分钟,不换算为汉字数或英文 WPM。实时速度是过去 60 秒内实际记录的次数,不会把短时间输入放大推算;停止输入后逐渐下降,满 60 秒无输入时归零,重启后重新累计。历史速度按本机 HH:MM 固定分钟保存,当前分钟尚未结束时显示暂时计数;分钟峰值取所选日记录的最大分钟计数,活跃分钟均速为所选日分钟总数除以有输入的分钟数,取整数。暂停期间不计入新按键,但暂停前输入会在实时窗口内保留直到到期。

升级自动创建分钟记录表,保留旧版每日/小时历史;旧版没有分钟记录,不能还原旧版输入速度。速度 CSV 导出所有已记录分钟,未记录的分钟省略;图表空缺按 0 绘制,不代表程序未运行期间已经采集。系统时钟回拨或夏令时重复出现的同一个本机分钟会合并计数。

键盘采集运行在独立线程,计数经内存队列交给界面线程,约每秒在一个事务中写入 SQLite。数据库使用 WAL 和 synchronous=FULL;写入失败时保留待写计数并重试,在窗口底部提示错误。主动退出会停止采集并保存全部待写计数;保存失败时恢复采集并保留窗口。系统关机也会尝试保存。强制结束进程或突然断电可能丢失最近约 1 秒的未保存计数,磁盘故障或长期无法写入会扩大这个范围。

日期使用本机时区,跨午夜自动分到新的一天;时区或系统时钟改变后按新的本机时间归属,不重新计算过去的数据。按日历日期计算图表范围,避免夏令时导致一天出现两次或丢失。日均按最近 30 个日历日总量除以 30,取整数,不按活跃天数计算。

备份时先选择“保存并退出”,再复制 keycount.db。如果程序仍在运行,不要仅复制主数据库;此时最新已提交数据可能还在 keycount.db-wal 内。恢复备份时同样先完全退出,再替换数据库。正常版本不会创建演示数据。

从源码编译

安装 Visual Studio 2022 Build Tools 的“使用 C++ 的桌面开发”、Windows 10/11 SDK 和 CMake 3.24+。SQLite 源码已随项目提供,编译过程无需下载依赖。

在项目目录运行 PowerShell:

./scripts/build.ps1

或运行:

cmake -S . -B build -G "Visual Studio 17 2022" -A x64
cmake --build build --config Release --parallel
ctest --test-dir build -C Release --output-on-failure

输出:build/Release/KeyCount.exe。MSVC 使用静态运行时,发布时只需 EXE。发布包可通过 ./scripts/package.ps1 生成。

使用 mcpp 构建

已提供独立的 mcpp 原生配置 mcpp.toml,直接编译同一份 C++20、SQLite C 源码及 Windows 资源。固定使用 mcpp 2026.10.5.3;仍需安装 Visual Studio 的 C++ 桌面开发工具与 Windows SDK。

# 首次自动下载并校验官方 mcpp 工具包,初始化项目内工具环境。
# 编译、运行自动测试与内存数据库 UI 冒烟测试,然后打包。
./scripts/build-mcpp.ps1

# 完成首次初始化后,可以完全离线重建。
./scripts/build-mcpp.ps1 -Offline

# 带调试信息的构建;默认发布构建为 release。
./scripts/build-mcpp.ps1 -Profile dev -Offline

独立程序:dist/KeyCount-mcpp/KeyCount.exe。独立压缩包:dist/KeyCount-<版本号>-mcpp-Windows-x64.zip。包内 build-info.json 记录构建工具、实际编译器、SDK、构建指纹、EXE 与源码 SHA-256 及验证结果。发布构建使用静态运行库,保留图标、版本信息、普通用户权限与 PerMonitorV2 高清屏适配。

mcpp 和 Ninja 首次初始化需要联网,均位于 build/tools 的项目内环境;不要求全局安装 mcpp。msvc@system 使用本机安装的 MSVC,编译器与 SDK 更新后构建记录也会改变。工具来源和固定哈希见 docs/mcpp-tool.md。

也可以手动调用项目内 mcpp:

. ./scripts/mcpp-env.ps1
$mcpp = ./scripts/bootstrap-mcpp.ps1
& $mcpp build --release --strict
& $mcpp test --profile release --strict
& $mcpp run KeyCount --release -- --background

mcpp-env.ps1 在当前 PowerShell 会话中声明 SDK 并加入 SDK 的资源编译器目录,解决该版 mcpp 的 MSVC 资源工具发现问题;一键脚本会在完成后还原环境变量。底层构建产物位于 target/x86_64-windows-msvc/<构建指纹>/bin/KeyCount.exe。mcpp test 仅构建控制台测试,因此该版工具可能提示本次测试未嵌入应用资源;发布 EXE 的资源由 mcpp build 构建并嵌入。

两个构建版本使用同一个 %LOCALAPPDATA%\KeyCount\keycount.db 和单实例机制。切换到 mcpp 版本时,先在旧版本托盘菜单选择“保存并退出”,再启动 mcpp 版,历史数据会自动沿用。

验证与开发

自动测试覆盖:输入键分类、快捷键和模拟输入过滤、长按判定、跨年/闰年/午夜日期、空白日期补零、小时与分钟写入的事务回滚、锁冲突后重试、关闭后重开恢复、旧版升级、60 秒速度窗口边界及闲置归零、中文目录、暂停状态持久化、CSV 与 64 位计数。测试使用独立临时数据库,不影响真实数据。

# 启动真实窗口与键盘钩子,验证内存队列、持久化、暂停、范围切换和退出。
# 使用内存数据库,约 1 秒后自行退出,验证悬浮窗不抢焦点、叠加特效及到期清理,不写入真实统计。
./scripts/test-ui.ps1

# 用隔离的内存演示数据渲染界面图片,不安装键盘钩子、不操作真实数据库。
$dashboardPath = Join-Path (Get-Location).Path 'docs/dashboard.png'
Start-Process ./build/Release/KeyCount.exe -ArgumentList "--preview `"$dashboardPath`"" -Wait

# 分钟速度窗口的独立演示预览,同样使用内存数据库。
$speedPath = Join-Path (Get-Location).Path 'docs/speed.png'
Start-Process ./build/Release/KeyCount.exe -ArgumentList "--preview-speed `"$speedPath`"" -Wait

预览还支持 --range 7|30|90、--width 880、--height 720。这些选项仅用于图片预览,最小尺寸为 880×720。--background 用于托盘后台启动。

实际物理键盘跨应用计数仍需在使用环境下人工核验:在记事本按 A、B、空格,各计 1;按 Ctrl+C、方向键、退格不计;长按 A 只计 1;关闭窗口后继续输入、从托盘重新打开、退出后再开检查历史。模拟输入测试不能代替物理输入,因为程序主动过滤模拟事件。

主要代码:src/main.cpp 为 Win32 界面、GDI+ 图表、托盘和采集;src/core.* 为统计规则与日历;src/storage.* 为 SQLite 事务;tests/core_tests.cpp 为自动测试。

SQLite 3.53.4 为公共领域软件,来源与下载包 SHA-256 记录于 third_party/sqlite/NOTICE.md。

版本管理

VERSION 是版本号的统一来源;运行 ./scripts/set-version.ps1 -Version 1.2.1 同步 mcpp 配置和 Windows 版本资源。./scripts/set-version.ps1 -Check 检查一致性,两套构建入口都会执行该检查。

采用语义化版本、main 主分支、功能分支和 v1.2.0 形式的发布标签。每个版本在 CHANGELOG.md 记录变化;发布流程见 CONTRIBUTING.md。GitHub Actions 自动执行两套构建与测试,推送版本标签后生成版本化下载包和 SHA-256 清单。

首次上传已准备好的本地仓库:先用 gh auth login 登录,再运行 ./scripts/publish-github.ps1。脚本默认创建当前账号下的公开仓库 keycount 并推送已有版本标签;不会覆盖同名仓库。

许可证

KeyCount 的源码及自有资源采用 MIT License。SQLite 为公共领域软件,保留其原始声明。mcpp 仅作为构建工具使用,不包含在程序发布包中。

About

Windows native typing counter with persistent charts, an animated edge widget and input speed history. C++20 / SQLite / mcpp.

Topics

Resources

Contributing

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages