☰
AutoClicker配置持久化与日志机制详解:System.Text.Json与Serilog完整实现走读
2026/9/25 3:13:02 网站建设 项目流程

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)

执行流程是四步防御式设计:

  1. 文件不存在 → 打一条Warning日志,返回default(即 null),不崩溃;
  2. 文件存在 →File.ReadAllText读取后用JsonSerializer.Deserialize<T>反序列化;
  3. JSON 格式损坏(抛JsonException)→ 记录Error日志后重新抛出,让调用方知晓;
  4. 成功 → 打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 行的小型代码库,展示了桌面应用持久化与日志的完整最小实践:

  1. System.Text.Json负责序列化,WriteIndented保证可读性,JsonPropertyName美化字段名;
  2. %APPDATA% + JSON 文件作为持久化载体,无权限问题、跨用户独立、可手工维护;
  3. Serilog 双 Sink(Console + File)让开发者调试与用户排查共用一套日志;
  4. 静态构造函数 + 单例设置对象 + 事件通知,把"加载 → 修改 → 落盘 → 生效"串成自动化闭环。

这套模式简单、稳健、无第三方数据库依赖,非常适合作为中小型 WPF/WinForms 工具的参考模板。🚀

【免费下载链接】AutoClickerAutoClicker is a useful simple tool for automating mouse clicks.项目地址: https://gitcode.com/gh_mirrors/au/AutoClicker

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询