AutoClicker配置持久化与日志机制详解:System.Text.Json与Serilog完整实现走读
【免费下载链接】AutoClickerAutoClicker is a useful simple tool for automating mouse clicks.项目地址: https://gitcode.com/gh_mirrors/au/AutoClicker
AutoClicker 是一款 Windows 上的鼠标点击自动化工具,用它可以让鼠标按设定间隔自动单击、双击或拖动。它最贴心的设计之一是配置持久化:你设置的快捷键、点击间隔、点击位置会自动保存为 JSON 文件;而每一次启动、注册热键、开始/停止点击,都会通过Serilog 日志框架写入日志文件。本文带你完整走读这套基于System.Text.Json与Serilog的实现,帮你快速看懂配置存到哪了、日志怎么查。
📁 先搞清楚:配置文件和日志放在哪里?
很多用户找不到 AutoClicker 的设置存在哪里。答案集中在一个常量文件里:
- 配置文件:
%APPDATA%\AutoClicker\AutoClicker_Settings.json(在 Windows 中通常是C:\Users\你的用户名\AppData\Roaming\AutoClicker\) - 日志文件:
%APPDATA%\AutoClicker\AutoClicker_Logs.txt
这两个路径在 Constants.cs 中定义:
public const string SETTINGS_FILE_PATH = "AutoClicker_Settings.json"; public const string LOG_FILE_PATH = "AutoClicker_Logs.txt";在 SettingsUtils.cs 中,程序用Environment.SpecialFolder.ApplicationData(即%APPDATA%目录)拼接出最终路径。为什么选 %APPDATA%?因为它是 Windows 标准的"按用户存储应用数据"的位置:
- 每个用户独立,多用户互不干扰
- 不需要管理员权限就能写入(程序文件目录往往需要管理员权限)
- 卸载程序时不会被误删
🧩 配置模型:三层结构承载所有设置
AutoClicker 把所有设置组织成一个树状结构,入口类是 ApplicationSettings.cs:
| 模型类 | 职责 | 持久化字段举例 |
|---|---|---|
| ApplicationSettings | 总入口,聚合下面两组设置 | — |
| HotkeySettings | 开始/停止/切换 3 个全局热键 | StartHotkey、StopHotkey、ToggleHotkey |
| AutoClickerSettings | 点击行为本身 | 间隔(时分秒毫秒)、鼠标按键、单双击、重复模式、坐标 |
默认快捷键是F5 开始、F6 停止、F7 切换,定义在 HotkeySettings.cs 中,并通过 KeyMappingUtils 从内置的 keyMappings.json 资源中解析出按键映射。
一个细节亮点在 KeyMapping.cs:它使用[JsonPropertyName]特性把 C# 的 PascalCase 属性名映射成 JSON 里的 snake_case 字段名(如display_name、virtual_key_hex_code),让配置文件对阅读者更友好。而且VirtualKeyHexCode的 setter 里会自动把十六进制字符串(如"0x75")转成 Windows API 需要的整数虚拟键码——反序列化时一次赋值,两种表示都齐了,这是 System.Text.Json 里很值得学习的技巧。
💾 持久化核心:JsonUtils 的读写封装
所有 JSON 读写都收口在一个静态工具类 JsonUtils.cs,只有两个方法:
1. 读取ReadJson<T>(L9-L32)
执行流程是四步防御式设计:
- 文件不存在 → 打一条
Warning日志,返回default(即 null),不崩溃; - 文件存在 →
File.ReadAllText读取后用JsonSerializer.Deserialize<T>反序列化; - JSON 格式损坏(抛
JsonException)→ 记录Error日志后重新抛出,让调用方知晓; - 成功 → 打
Debug日志返回结果。
2. 写入WriteJson<T>(L34-L46)
JsonSerializerOptions options = new JsonSerializerOptions { WriteIndented = true }; string jsonString = JsonSerializer.Serialize(data, options);关键就一个选项:WriteIndented = true(格式化输出)。这意味着配置 JSON 是人类可读的——你可以直接用记事本打开AutoClicker_Settings.json查看甚至手工修改(注意先关闭程序,避免被覆盖)。
💡为什么选 System.Text.Json 而不是 Newtonsoft.Json?它是 .NET 内置的高性能序列化库,依赖更少。本项目在 packages.config 中引用的是
System.Text.Json 5.0.2(因为目标框架是 .NET Framework 4.8,需要通过 NuGet 补齐该库)。
🔁 保存与加载的完整生命周期
真正的编排逻辑在 SettingsUtils.cs,它用静态属性 + 静态构造函数保证整个应用只有一份设置实例:
应用启动 └─ 静态构造函数触发(每次进程启动仅一次) ├─ 初始化 Serilog 日志(见下一节) └─ LoadSettingsFromFile() ← 读 JSON,null 则用默认值 ↓ 用户修改设置(改热键 / 点设置窗口"保存") ├─ SetStartHotKey / SetStopHotKey / SetToggleHotKey │ └─ 修改内存对象 → 触发 HotKeyChangedEvent → SaveSettingsToFile() └─ SetApplicationSettings()([L87-L104](https://link.gitcode.com/i/e02145a9b8072da43296929ff3f99408)) └─ 逐项拷贝 UI 设置到内存对象 → SaveSettingsToFile() ↓ SaveSettingsToFile() → JsonUtils.WriteJson() → 落盘到 %APPDATA%几个值得注意的设计点:
- 事件驱动联动:改热键时不仅保存,还会触发
HotKeyChangedEvent事件(L67),主窗口 MainWindow.xaml.cs 收到后重新向 Windows 注册热键,实现"保存即生效"; - 一键重置:
Reset()(L48-L53)会把开始/停止热键还原为 F5/F6 默认值并自动落盘; - 首次运行的兜底:
LoadSettingsFromFile(L74-L85)发现文件不存在时不会报错,而是new ApplicationSettings()生成一份全新默认设置——所以你第一次运行永远能正常看到主界面。
📝 日志机制:Serilog 控制台 + 文件双通道
日志的初始化藏在 SettingsUtils 的静态构造函数 里,全部 6 行:
Log.Logger = new LoggerConfiguration() .MinimumLevel.Debug() .WriteTo.Console() .WriteTo.File(logFilePath) .CreateLogger();| 配置项 | 作用 |
|---|---|
MinimumLevel.Debug() | 最低级别设为 Debug,即全量记录(Debug < Information < Warning < Error) |
WriteTo.Console() | 输出到控制台,方便调试时在 VS 输出窗口看到 |
WriteTo.File(logFilePath) | 同步写入%APPDATA%\AutoClicker\AutoClicker_Logs.txt |
这三个 Sink 来自 packages.config 中的三个 NuGet 包:Serilog 2.10.0、Serilog.Sinks.Console 4.0.0、Serilog.Sinks.File 5.0.0——核心库 + 需要的 Sink 按需组合,正是 Serilog "模块化"设计哲学的体现。
日志都记录了什么?
项目里Log.Information / Debug / Warning / Error覆盖了一条清晰的"用户旅程":
- 启动:
Logger initialized successfully(SettingsUtils.cs#L26) - 热键管理:
RegisterHotkey with hotkeyId...、UnregisterHotkey...(MainWindow.xaml.cs#L307-L316),注册失败会打 Warning - 点击任务:
Starting operation, interval=150ms/Stopping operation(MainWindow.xaml.cs#L121-L139) - 坐标捕捉窗口:检测到的屏幕数量、捕捉到的鼠标坐标(CaptureMouseScreenCoordinatesWindow.xaml.cs#L37-L87)
- 退出:
Application closing(MainWindow.xaml.cs#L108)
所有日志都使用 Serilog 的结构化占位符语法{FilePath}、{HotkeyId}而不是字符串拼接,既安全(无注入/拼接错误风险)又便于后续检索分析。
🔍 实战:新手常见问题解答
Q1:我想恢复默认设置,怎么办?设置窗口中有"重置"按钮,它会调用Reset()把热键还原为 F5/F6。如果想完全重来,直接删除%APPDATA%\AutoClicker\AutoClicker_Settings.json即可,下次启动自动重建默认配置。
Q2:热键不生效,去哪排查?打开AutoClicker_Logs.txt,搜索RegisterHotkey或UnregisterHotkey。若看到Warning: No hotkey registered on 9000,说明 Windows 热键注册失败(通常是 F5/F6/F7 被其他软件占用),换一个键再保存即可。
Q3:日志文件会无限增长吗?当前实现是简单追加写入。如果你长期运行且任务频繁,日志会持续变大,可以定期手动清理该文件——它只是辅助排查工具,删除不影响任何功能。
Q4:可以手工编辑配置文件吗?可以。文件是格式化 JSON,关闭程序后用记事本编辑AutoClicker_Settings.json,注意保持virtual_key_hex_code为十六进制字符串(如"0x75"),重新打开程序即可加载。
✅ 总结
AutoClicker 用一个约 150 行的小型代码库,展示了桌面应用持久化与日志的完整最小实践:
- System.Text.Json负责序列化,
WriteIndented保证可读性,JsonPropertyName美化字段名; - %APPDATA% + JSON 文件作为持久化载体,无权限问题、跨用户独立、可手工维护;
- Serilog 双 Sink(Console + File)让开发者调试与用户排查共用一套日志;
- 静态构造函数 + 单例设置对象 + 事件通知,把"加载 → 修改 → 落盘 → 生效"串成自动化闭环。
这套模式简单、稳健、无第三方数据库依赖,非常适合作为中小型 WPF/WinForms 工具的参考模板。🚀
【免费下载链接】AutoClickerAutoClicker is a useful simple tool for automating mouse clicks.项目地址: https://gitcode.com/gh_mirrors/au/AutoClicker
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考