如何使用claude code 从零写出一个Windows截图/录屏工具
课余时间做的一个小项目,记录一下过程。
为什么要做这个
平时写作业、做课设、跟同学讨论问题,经常需要截图发出去。用过很多截图工具,总觉得不太顺手------要么功能太多用不上,要么弹个窗口打断思路,要么录个屏还要开会员。
我就想,能不能做一个按一下快捷键就完成截图+批注+复制的工具,整个过程不离开当前窗口。
更直接的想法是:我想试试 Claude Code 到底能不能帮一个人从零做出一个能用的桌面软件。
技术栈
我平时主要做 C++,但上学期选修了一门 C# 课,对 C# 生态还算了解。Windows 桌面开发 WPF 是主流,所以就选了这个技术栈:
- C# 12 + .NET 9:选修课学了一学期 C#,WPF 做桌面 UI 比较成熟
- CommunityToolkit.Mvvm:微软官方的 MVVM 框架,用源生成器能少写很多样板代码
- FFmpeg:录屏用的,调用命令行就行,不用自己写编码器
- xUnit + Moq:写单元测试用的
关于 Claude Code 和模型选择
这个项目全程用 Claude Code 开发。Claude Code 是 Anthropic 出的 AI 编程工具,可以直接在终端里用,也能装 VS Code 插件。
我用了两个模型配合:
| 模型 | 用途 | 说明 |
|---|---|---|
| GPT-5.5 | 架构设计、方案讨论 | 做整体规划、技术选型、功能设计 |
| mimo-v2.5-pro | 写代码、Debug | 具体的代码实现、Bug 修复、重构 |
为什么这么分?GPT-5.5 在宏观设计上思路比较清晰,适合聊架构、做决策。mimo-v2.5-pro 写代码更稳,特别是处理 Win32 API、XAML 布局这些细节的时候,生成的代码质量很高,基本不用大改。
开发过程
确定功能范围
一开始想做很多功能,后来砍到四个核心功能,分别绑到四个快捷键:
| 快捷键 | 功能 |
|---|---|
| F1 | 区域截图 → 批注 → 复制/保存 |
| F2 | 开始/停止录屏 |
| F3 | 把剪贴板图片贴到屏幕上 |
| F4 | 屏幕取色 |
设计原则是一个快捷键搞定一件事,不需要打开主窗口。
搭项目骨架
跟 Claude Code 聊了一下整体架构,它帮我搭好了项目结构:
SnipEasy.App/
├── Models/ # 数据模型
├── Services/ # 业务逻辑
├── ViewModels/ # MVVM 绑定
├── Storage/ # 持久化
├── Native/ # Win32 API 调用
└── Controls/ # 自定义控件
从第一天就用了依赖注入,所有服务都通过 DI 容器管理。后面写测试的时候发现这个决定太对了------mock 服务非常方便。
截图 + 批注
截图的核心是调 Win32 API:
csharp
[DllImport("gdi32.dll")]
static extern bool BitBlt(IntPtr hdc, int x, int y, int cx, int cy,
IntPtr hdcSrc, int x1, int y1, uint rop);
这部分 Claude Code 帮了很多忙,特别是多显示器和 DPI 缩放的处理------Windows 的多显示器坐标系很坑,主显示器可以是负坐标,不处理好的话截图位置会错位。
批注功能用的是 WPF 的 InkCanvas,做了 9 种工具:画笔、矩形、椭圆、文字、箭头、马赛克、高亮、模糊、选择。全部在同一个全屏覆盖层上完成,截图完直接进入批注,批注完直接复制或保存。
录屏
录屏是最麻烦的部分。一开始想自己写编码器,发现太复杂了,后来改成调 FFmpeg 命令行。
Claude Code 帮我设计了一个策略模式:优先用 FFmpeg 输出 MP4,如果用户没装 FFmpeg 就自动回退到内置的 AVI 写入器(无音频)。
csharp
public class RecordingServiceCoordinator
{
public async Task StartRecording(...)
{
if (await _ffmpegService.CanStartAsync())
await _ffmpegService.StartAsync(...);
else
await _aviService.StartAsync(...);
}
}
FFmpeg 的参数也是跟 Claude Code 一起调的:
-f gdigrab -framerate 12 -i desktop
-c:v libx264 -preset veryfast -crf 26
-c:a aac -b:a 192k -ar 48000
全局热键
Windows 的 RegisterHotKey 经常被其他程序抢占,Claude Code 帮我做了双重注册:先试系统级热键,失败了就用低级键盘钩子兜底。
csharp
if (!NativeMethods.RegisterHotKey(_windowHandle, id, flags, virtualKey))
{
_hookHandle = NativeMethods.SetWindowsHookEx(
NativeMethods.WhKeyboardLl, _hookProc, moduleHandle, 0);
}
这个方案跑了挺久,目前没出过问题。
一些细节
做着做着发现很多细节不处理不行:
- 文件写入 :写到一半程序崩了怎么办?改成先写
.tmp再复制,保证原子性 - 日志:日志文件会越来越大,做了滚动日志,2MB 上限,保留 3 个归档
- 崩溃报告:三级异常捕获,自动生成诊断包,方便排查问题
- 单实例:用 Mutex 防止重复启动
- 状态保存:贴纸位置、录屏草稿,关了再开还能恢复
遇到的坑
WPF 渲染时机
WPF 的控件尺寸是异步计算的,构造函数里拿不到。一开始在构造函数里算工具栏位置,结果全是 0。后来改成在 Loaded 事件里处理才解决。
FFmpeg 进程管理
调 FFmpeg 命令行的时候,如果不正确处理 stdout/stderr,进程会死锁。Claude Code 帮我写了一个完整的进程管理器,处理了超时、取消、错误输出这些情况。
小选区的工具栏布局
用户截一个很小的区域(比如 50x50 像素),工具栏有 500 多像素宽,放不下了。这个问题修了好几版,最后改成用 WrapPanel 自动换行 + 三级紧凑模式(正常/紧凑/极简),才算是解决了。
Claude Code 使用经验
工作流
我的开发流程大概是这样的:
- 先用 GPT-5.5 讨论方案:把需求说清楚,让它给出技术方案和架构设计
- 再用 mimo-v2.5-pro 写代码:把方案丢给它,让它实现具体的代码
- 遇到问题再切回 GPT-5.5:分析问题原因,讨论解决方案
- 修完代码继续用 mimo-v2.5-pro:实现修复,写测试验证
两个模型配合用,比单用一个效果好很多。
几个实用技巧
1. 给足上下文
Claude Code 能读取整个项目,但你还是要主动告诉它"我在做什么"、"现在遇到了什么问题"。别只丢一句"帮我修这个 Bug",要说清楚现象、复现步骤、你怀疑的原因。
2. 让它先读代码再改
我一般先让它读相关的文件,理解现有逻辑,再让它改。直接让它改容易改错方向。
3. 小步迭代
不要一次让它改太多东西。一次改一个功能,改完测完再改下一个。我有一次让它同时改了三个地方,结果互相冲突,调试了好久。
4. 善用 Plan Mode
Claude Code 有 Plan Mode,先让它分析问题、制定方案,你确认了再让它执行。特别是复杂的重构,先看方案再动手,避免改了半天方向不对。
5. 测试让它写
写测试是最枯燥的部分,但 Claude Code 写测试很快。你把实现代码给它,它能自动生成对应的单元测试,覆盖率还不错。这个项目 100 多个测试,大部分是它写的。
6. 不要完全依赖它
Claude Code 写的代码大部分时候是对的,但不是每次都对。特别是边界条件、并发问题这些,它可能考虑不到。最终还是要自己 review,自己测试。
哪些场景特别好用
- Win32 API 调用:P/Invoke 签名、参数含义、返回值处理,它记得比你清楚
- XAML 布局:WPF 的 XAML 写起来很繁琐,它能快速生成布局代码
- 正则表达式:复杂的正则表达式直接让它写,比自己调试快多了
- 进程管理:FFmpeg 进程的启动、监控、取消、错误处理,这些样板代码它写得又快又好
- Bug 排查:把报错信息贴给它,它能分析出可能的原因,比自己 Google 快
哪些场景不太行
- UI 美化:它能写出功能正确的布局,但好不好看得自己调
- 性能优化:它能做基本的优化,但真正的性能瓶颈还得自己 profiling
- 业务逻辑:具体的功能逻辑还是要自己想清楚,它只是帮你实现
最终成果
- 区域截图 + 9 种批注工具
- 屏幕录屏 + 音频录制(双后端)
- 贴纸钉图 + 状态持久化
- 屏幕取色器
- 全局热键 + 系统托盘
- 100+ 单元测试
- 安装包 1.4 MB
开源在 GitHub 上了:https://github.com/ywx914705/SnipEasy
产品官网:https://snipe.cc.cd
几点感受
- 先想清楚再写代码:功能范围、架构设计、数据模型,这些想清楚了后面会顺很多
- 小步迭代:每次只做一个功能,做完测完再做下一个,不要一口气写太多
- 测试真的有用:一开始觉得写测试浪费时间,后来改代码的时候发现有测试兜底太安心了
- 模型要选对:设计用 GPT-5.5,编码用 mimo-v2.5-pro,各有所长
- Claude Code 不是万能的:它能帮你写代码、分析问题,但最终的判断和取舍还是得自己来