🐱
WPF 学习实战作品 · 2025

客服喵
我的一个 WPF 练手项目

学 WPF 的时候想找个有实际意义的东西练手——一个朋友每天做电商客服,反复粘贴同样的回复很麻烦, 就用这个场景写了这个小工具。算是边学边做的实战记录,感兴趣的朋友欢迎下载试试看。

Windows 桌面工具 WPF / .NET 8 / C# 当前版本 v1.0
01 开发初衷

没有宏大叙事,只是一个程序员想帮家人省力气

一个做电商客服的朋友找我抱怨:每天面对上百条重复的问题——"发货了吗"、"怎么退款"、"有优惠吗"…… 他的做法是把常用回复存在便签软件里,需要时切出去复制,再切回聊天窗口粘贴。 这个动作每天要重复几百次,听着就累。

我搜了一圈同类工具,要么太笨重、要么 UI 丑到难以下手、要么收费感人。 正好那段时间在学 WPF,就用这个需求当练手项目,顺手做了一个。

"Alt 双击弹出搜索框,输几个拼音首字母,回车发送。"——这是我最初想要的唯一体验, 后来功能越加越多,但这个核心交互到现在都没变。

断断续续做了几个月,中间踩了不少坑(主要是 Win32 API 的窗口权限问题,后面有专门的笔记)。 现在自己用着还挺顺手,就分享出来,希望能帮到同样有这个需求的朋友。

02 功能分享

没有什么"革命性"的东西,都是些让日常操作省心一点的小功能

双击热键,秒弹搜索

默认双击 Alt 唤出浮动搜索框。支持拼音首字母、关键词模糊匹配,常用的回复会自动排到前面。

🧠

智能感知,自动弹出

用 Win32 Caret 检测技术——鼠标点进任意聊天输入框,搜索面板自动浮现,不用手动触发热键。

🖼️

图文视频一起发

每条回复可附带多张图片和视频。发送时通过剪贴板注入,兼容京麦、拼多多、微信等主流平台。

📁

分类管理

按"售前问题"、"物流查询"、"售后处理"等自由分类,支持拖拽排序、批量导入。

📦

批量导入 / 搜狗词库

从文本文件一次导入所有回复,还支持直接读取搜狗输入法词库文件,老用户迁移很方便。

🤖

AI 辅助回复(实验中)

调了个 AI 接口,可以根据你已有的词库生成建议回复。免费注册后可以每天试用 50 次,主要是自己玩玩。

🔒

数据全部本地存

所有回复数据都保存在本机,不上传服务器。AI 功能也是走服务端代理,密钥不会出现在客户端里。

🛡️

高权限穿透

京麦、拼多多商家后台这类软件自身权限很高,以管理员身份运行本工具后可以正常置顶和注入。

03 开发踩坑记录

写给自己备忘,也许对同样在折腾 WPF + Win32 的朋友有用

01

Electron 架构里 Window.Activate() 会随机失效

京麦是 Electron 套壳应用,它内部有一层自己的消息循环。直接调用 WPF 的 Activate() 有时候根本不顶用,窗口跑到任务栏闪烁但就是不浮上来。 最终换成 Win32 的 SetForegroundWindow + ShowWindow(SW_RESTORE) 组合拳,才稳定解决。

SetForegroundWindow ShowWindow Electron兼容
02

高 DPI 下图片缩略图发虚

在 150% / 200% 缩放的屏幕上,从 BitmapImage 生成缩略图会按物理像素渲染, 显示时被系统再次缩放就糊了。解法是在加载时根据 VisualTreeHelper.GetDpi() 拿到当前 DPI,乘上缩略图尺寸,生成高分辨率版本。

BitmapImage VisualTreeHelper.GetDpi 高DPI适配
03

用剪贴板发图片时的竞争条件

原始方案:写入剪贴板 → 模拟 Ctrl+V。但多张图片连发时, 第二张的写入操作可能在第一张的粘贴动作完成前就覆盖了剪贴板,导致漏发。 改成队列化处理,每次发送前等待一个固定延迟再写下一张,成功率大幅提升。

Clipboard SendInput 队列化处理
04

全局键盘钩子 + 自定义双击判定

SetWindowsHookEx(WH_KEYBOARD_LL) 挂全局低级键盘钩子, 然后自己实现一个"双击计时器":两次按键间隔小于设定阈值(默认 300ms)才判定为双击。 同时在双击触发时调用 CallNextHookEx 之前先拦截消息,避免 Alt 键在浏览器里打开菜单栏。

SetWindowsHookEx WH_KEYBOARD_LL CallNextHookEx
05

用 Caret 检测代替热键触发

部分商家后台会屏蔽热键。另辟蹊径:用 GetGUIThreadInfo 持续轮询前台线程的 Caret 状态, 当检测到光标进入文本输入框(hwndCaret != IntPtr.Zero),自动弹出搜索面板。 这个方案对绝大多数 Win32、Electron 软件都有效。

GetGUIThreadInfo hwndCaret 智能感知
04 项目更新日志

记录每次折腾的成果,方便自己回顾,也告诉用户改了什么

v1.0 最新 2026-02-21
  • 支持在回复里附加视频文件(mp4、avi、mov),发送逻辑全面重构
  • 搜索结果列表新增图片/视频缩略图预览,一眼就知道这条回复是什么
  • 列表项新增 [含图片] / [含视频] 状态标签
  • 🔧修复高 DPI 屏幕下缩略图发虚的问题
  • 🔧优化剪贴板文件队列,提高大文件发送成功率
v0.8 2026-02-18
  • 加入「智能感知模式」:基于 Win32 Caret 检测,点击输入框自动弹出面板
  • 自定义热键:可以录制任意按键作为触发键,还能调双击灵敏度
  • 🚀改用 Win32 底层 SetForegroundWindow,彻底解决在京麦/拼多多里窗口置顶失败的问题
  • 🚀双击触发时自动拦截按键消息,防止触发浏览器/Office 的菜单栏
  • 🔧修复 Electron 架构软件中 Activate() 偶尔失效的问题
v0.7 2026-02-10
  • AI 辅助回复功能上线(实验性),结合本地词库生成建议回复
  • 搜狗输入法词库一键导入
  • 批量从文本文件导入回复
  • 💄独立图库管理窗口,支持关键词搜索
v0.5 2025-12-01
  • 🎉第一个能跑的版本,朋友试用了一天说还行
  • 基础功能:热键触发、模糊搜索、文本 + 图片回复
  • 分类管理、托盘图标、数据本地 JSON 存储
05 测试版本分享

开发版,可能有 Bug,欢迎试用并发邮件反馈,我尽量修

客服喵 v1.0 · 开发版 · Windows

这是我 WPF 学习实战过程中的阶段性作品,仍在持续迭代中。运行需要 .NET 8 Desktop Runtime, 首次运行建议以管理员身份运行, 否则在京麦、拼多多商家后台里可能无法置顶。

开发版下载 (.zip)
ℹ️ 如果安装包被 Windows Defender 拦截,是因为个人开发的程序没有买代码签名证书(一年好几千块……), 点「更多信息 → 仍要运行」即可。数据全部本地存储,不会偷跑任何东西。
06 关于我

普通打工人,下班后折腾代码

网名 / 作者
Alee
联系方式(欢迎技术交流)
主要技术栈
C# WPF .NET 8 Win32 API ASP.NET Core MySQL Linux / Nginx
关于这个博客
这里会陆续记录我业余折腾的小项目和踩过的坑。 没有固定更新频率,有新东西再写。如果你在使用「客服喵」时遇到 Bug, 或者有什么功能建议,直接发邮件就好,我看到都会回的。