一个给打印店用的 Windows 小程序:自动读取打印队列的页数 → 按页数算钱 → 打印完成弹出收款码, 并且支持“老板自己打印不收费、别人打印先加微信征得同意再打印”。 程序会常驻任务栏托盘,开机自动启动,平时不用管它。
| 场景 | 程序的行为 |
|---|---|
| 你自己(管理员)打印 | 不收费、不打扰,只记一条免费流水 |
| 客户打印(未登录 / 普通账号) | 打印前暂停打印机队列并弹出审批窗,让客户先加你微信、你点“同意”后才开始打印 |
| 客户打印完成 | 自动弹出收款码(微信 + 支付宝)+ 应付金额 + 你的微信号,客户扫码付款后你点“已完成付款” |
| 每天收工 | 主界面显示今日单数、总页数、应收 / 已收 / 未收金额;全部流水存在 SQLite 里 |
已经帮你做好三件事:
- 桌面快捷方式:
桌面 → 打印计费助手(双击即开,带自制图标); - 开机自动启动:快捷方式已放进系统“启动”文件夹,开机后静默进入托盘、不弹窗口;
- 常驻任务栏托盘:程序一直在后台盯着打印队列,点窗口右上角的 ✕ 只是把窗口收起来, 程序继续运行(要彻底退出请用托盘右键菜单里的“退出程序”)。
在另一台电脑上部署(比如店里的电脑):
- 把
发布版文件夹整个拷过去(或解压PrintPay-打印计费助手.zip),放在纯英文路径下,例如D:\AiCode\PrintPay\发布版; - 双击
PrintPay.exe→ 首次运行会提示默认管理员 admin / admin123 → 立刻点“修改密码”改成你自己的; - 点 设置 → 选择要监控的打印机(例如
Brother DCP-1618W)→ 填微信号和单价 → 确定, 程序会自动开始监控; - 需要开机自启时,把
PrintPay.exe的快捷方式放进启动文件夹: 按Win + R→ 输入shell:startup→ 回车 → 把快捷方式粘进去(记得在快捷方式的“目标”后面加上空格和--minimized, 这样开机后是静默进托盘,不弹窗口)。
┌───────────────────────────────────────────────────────────────┐
│ 运行状态 │
│ 监控中:Brother DCP-1618W 打印机:工作中 当前身份:未登录 │
│ 今日:3 单 / 25 页 · 应收 2.50 元 · 已收 2.00 元 · 未收 0.50 元 │
│ [开始/停止监控] [恢复打印机] [模拟一次打印] [设置][改密][登录] │
├──────────────────────────────┬────────────────────────────────┤
│ 作业列表(作业号/文档/页数/份数/状态/是否收费) │ 运行日志(实时滚动) │
└──────────────────────────────┴────────────────────────────────┘
托盘图标(任务栏右下角)右键菜单:
| 菜单项 | 作用 |
|---|---|
| 显示主窗口 | 把窗口调出来(也可以双击托盘图标) |
| 开始监控 / 停止监控 | 切换是否盯着打印队列 |
| 恢复打印机 | 万一打印机卡在“已暂停”,一键恢复 |
| 退出程序 | 真正结束程序(会先自动恢复打印机) |
程序在“发现新作业需要你同意”和“打印完成需要收款”时会弹气泡提醒, 并把主窗口自动调出来,避免窗口收在托盘里你没注意到。
| 配置项 | 默认 | 含义 |
|---|---|---|
print/printerName |
空 | 要监控的打印机名(设置里选好会自动写入) |
print/pollIntervalMs |
800 | 队列检查间隔(毫秒),200~10000 |
billing/pricePerPageCents |
10 | 每页单价,单位分(10 = 0.10 元/页) |
billing/minChargeCents |
10 | 最低消费,单位分 |
contact/wechatId |
你的微信号 | 收款弹窗与审批弹窗上显示的微信号 |
policy/chargeOthers |
true | 其他人(含未登录)打印是否收费 |
policy/chargeAdmin |
false | 管理员打印是否收费(false = 免费) |
policy/requireApprovalForOthers |
true | 其他人打印前是否需要你同意(会先暂停打印机) |
policy/requireApprovalForAdmin |
false | 你自己打印是否需要同意 |
policy/autoPaymentDialog |
true | 打印完成后是否自动弹收款码 |
policy/fullScreenPayment |
false | 收款码窗口是否最大化(屏幕大、客户好扫) |
ui/closeToTray |
true | 点关闭按钮时:true = 收进托盘继续监控,false = 直接退出程序 |
ui/startMinimized |
false | 启动时是否隐藏主窗口(命令行加 --minimized 等效) |
state/pausedByApp |
false | 运行状态:打印机是否被本程序暂停。不要手工改 |
- “先拦住再打印”的原理:客户提交作业后,程序把打印机队列设为“暂停”,
作业停在队列里不会打到纸上;你点“同意”后队列自动恢复,文件才开始打印。
- 程序退出时会自动恢复打印机;如果程序被强制结束,下次启动也会自动恢复;
- 万一发现打印机一直不动,点界面或托盘菜单里的 “恢复打印机” 即可。
- 权限:读取页数普通权限即可;但“暂停打印机 / 取消作业”需要管理员权限。 程序启动时会自动检测:如果没有权限,界面顶部会出现黄色提示条并给出 “以管理员身份重启” 按钮,点一下就带权限重启。
- 页数显示“待填”时请手填:少数打印机驱动不上报页数(返回 0)。这时收款弹窗里 页数框是空的,按实际页数填一下,金额会自动重算。程序绝不替你猜页数。
- 不要同时运行两个程序:程序做了单实例限制,第二个实例会提示退出, 避免同一个作业被收两次钱。
- 未登录 = 收费:这是设计行为。要免收费就用自己的管理员账号登录。
- 数据都在程序目录:
printpay.db(流水)、config.ini(配置)、printpay.log(日志)。 删掉printpay.db就是清零重来(需先退出程序)。
printpay_core_test.exe :: 计费算法 / 账号 / 流水 / 业务状态机,共 108 项断言
printpay_core_test.exe --spooler :: 额外做一次真实打印队列测试(暂停后提交作业再取消,不会出纸)
PrintPay.exe --selfcheck :: 把主窗口/审批窗/收款窗/登录窗渲染成图片,存到 selfcheck 目录
PrintPay.exe --traytest :: 自动验证“点关闭按钮 = 收进托盘、程序继续运行”
PrintPay.exe --minimized :: 启动时不显示窗口,直接进托盘(开机自启用这个)| 现象 | 处理 |
|---|---|
| 双击桌面图标后看不到窗口 | 看任务栏右下角的托盘图标(可能上次设置成了“启动时不显示窗口”);双击托盘图标即可调出 |
| 点了窗口的 ✕,程序好像不见了 | 这是设计:窗口收进了托盘,程序还在监控。要退出请用托盘菜单“退出程序” |
| 不想开机自启了 | 删除启动文件夹里的快捷方式:Win+R → shell:startup → 回车 → 删掉 打印计费助手 |
| 选完打印机点确定,提示“打开打印机失败” | 打印机名变了(重装驱动会改名),在“设置”里点“刷新”重选 |
| 客户打完不出收款码 | 看日志里是否有“作业完成,弹出收款码”;若页数为 0,会在收款窗让你手填 |
| 收款码图片不显示 | 确认 assets\wechat_pay.png、assets\alipay_pay.jpg 存在(可换成自己的收款码,文件名保持一致) |
| 打印机被暂停了没恢复 | 点“恢复打印机”,或退出程序再打开(会自动恢复) |
| 想清零今天的账 | 退出程序后删除 printpay.db,重新打开就是空的 |
| 程序打不开,提示已在运行 | 见托盘已存在的图标;这是防止重复计费的保护 |
PrintPay.exe 主程序
printpay_core_test.exe 控制台自测(可选)
config.ini 配置(单价、微信号、策略、常驻方式)
printpay.db 流水数据库(SQLite,首次运行自动生成)
printpay.log 运行日志(自动滚动,单文件上限 4MB)
assets\wechat_pay.png 微信收款码
assets\alipay_pay.jpg 支付宝收款码
assets\app.ico 程序/托盘/快捷方式图标(另有 icon_16/32/256.png)
Qt6*.dll / platforms / sqldrivers / ... Qt 运行库(不要删,也不要单独移动 exe)
README.md 本说明
- 计费、账号、流水、业务状态机(未登录收费 / 管理员免费 / 拒绝取消 / 同意但免费): 108 项断言全部通过;
- 真实打印队列:暂停队列 → 提交作业 → 读到作业(作业号、文档名、提交者、页数、份数)
→ 取消作业 → 恢复队列,全流程通过(选
nul:端口的虚拟打印机测试,不出纸); - 界面:主窗口、审批弹窗、收款弹窗、登录窗渲染正常,收款码与图标加载成功;
- 托盘行为:验证过“点关闭按钮 → 窗口收起、程序继续运行”;
- 开机自启:启动文件夹快捷方式带
--minimized,开机后静默进托盘。
不想自己编译的话,可以直接下载已经打包好 Qt 运行库的发行版(解压即用,无需安装 Qt):
https://github.com/Lee041111/PrintPay/releases/latest
下载后:
- 解压到任意目录(建议纯英文路径,例如
D:\PrintPay); - 双击
PrintPay.exe,首次运行提示默认管理员 admin / admin123,请立刻改密码; - 把自己的收款码图片放进
assets文件夹:微信收款码命名wechat_pay.png、支付宝收款码命名alipay_pay.jpg(发行版里出于隐私考虑不含任何收款码图片,缺失时收款窗会提示你去哪放); - 在“设置”里选择打印机、填单价和微信号,即可开始使用。
本项目采用 MIT License —— 你可以自由使用、修改、分发甚至商用,唯一要求是保留版权声明与许可声明; 作者不对软件做任何担保(详见 LICENSE)。
MIT License
Copyright (c) 2026 李相平 (GitHub: Lee041111)