Skip to content
Lee041111Public

About

Print shop billing assistant: monitors the Windows print queue, charges per page, and shows WeChat/Alipay payment QR codes (C++17 + Qt6 + winspool).

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Latest commit

 

History

2 Commits

Folders and files

Repository files navigation

打印计费助手 PrintPay —— 使用说明

一个给打印店用的 Windows 小程序:自动读取打印队列的页数 → 按页数算钱 → 打印完成弹出收款码, 并且支持“老板自己打印不收费、别人打印先加微信征得同意再打印”。 程序会常驻任务栏托盘,开机自动启动,平时不用管它。


一、它解决什么问题

场景 程序的行为
你自己(管理员)打印 不收费、不打扰,只记一条免费流水
客户打印(未登录 / 普通账号) 打印前暂停打印机队列并弹出审批窗,让客户先加你微信、你点“同意”后才开始打印
客户打印完成 自动弹出收款码(微信 + 支付宝)+ 应付金额 + 你的微信号,客户扫码付款后你点“已完成付款”
每天收工 主界面显示今日单数、总页数、应收 / 已收 / 未收金额;全部流水存在 SQLite 里

二、安装与启动(本机已经配好了)

已经帮你做好三件事:

  1. 桌面快捷方式:桌面 → 打印计费助手(双击即开,带自制图标);
  2. 开机自动启动:快捷方式已放进系统“启动”文件夹,开机后静默进入托盘、不弹窗口;
  3. 常驻任务栏托盘:程序一直在后台盯着打印队列,点窗口右上角的 ✕ 只是把窗口收起来, 程序继续运行(要彻底退出请用托盘右键菜单里的“退出程序”)。

在另一台电脑上部署(比如店里的电脑):

  1. 把 发布版 文件夹整个拷过去(或解压 PrintPay-打印计费助手.zip),放在纯英文路径下,例如 D:\AiCode\PrintPay\发布版;
  2. 双击 PrintPay.exe → 首次运行会提示默认管理员 admin / admin123 → 立刻点“修改密码”改成你自己的;
  3. 点 设置 → 选择要监控的打印机(例如 Brother DCP-1618W)→ 填微信号和单价 → 确定, 程序会自动开始监控;
  4. 需要开机自启时,把 PrintPay.exe 的快捷方式放进启动文件夹: 按 Win + R → 输入 shell:startup → 回车 → 把快捷方式粘进去(记得在快捷方式的“目标”后面加上空格和 --minimized, 这样开机后是静默进托盘,不弹窗口)。

三、界面与托盘

┌───────────────────────────────────────────────────────────────┐
│ 运行状态                                                       │
│  监控中:Brother DCP-1618W      打印机:工作中     当前身份:未登录 │
│  今日:3 单 / 25 页 · 应收 2.50 元 · 已收 2.00 元 · 未收 0.50 元    │
│  [开始/停止监控] [恢复打印机] [模拟一次打印]  [设置][改密][登录]   │
├──────────────────────────────┬────────────────────────────────┤
│ 作业列表(作业号/文档/页数/份数/状态/是否收费) │ 运行日志(实时滚动) │
└──────────────────────────────┴────────────────────────────────┘

托盘图标(任务栏右下角)右键菜单:

菜单项 作用
显示主窗口 把窗口调出来(也可以双击托盘图标)
开始监控 / 停止监控 切换是否盯着打印队列
恢复打印机 万一打印机卡在“已暂停”,一键恢复
退出程序 真正结束程序(会先自动恢复打印机)

程序在“发现新作业需要你同意”和“打印完成需要收款”时会弹气泡提醒, 并把主窗口自动调出来,避免窗口收在托盘里你没注意到。


四、配置项(config.ini,也可以在“设置”里改)

配置项 默认 含义
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 运行状态:打印机是否被本程序暂停。不要手工改

五、重要注意事项

  1. “先拦住再打印”的原理:客户提交作业后,程序把打印机队列设为“暂停”, 作业停在队列里不会打到纸上;你点“同意”后队列自动恢复,文件才开始打印。
    • 程序退出时会自动恢复打印机;如果程序被强制结束,下次启动也会自动恢复;
    • 万一发现打印机一直不动,点界面或托盘菜单里的 “恢复打印机” 即可。
  2. 权限:读取页数普通权限即可;但“暂停打印机 / 取消作业”需要管理员权限。 程序启动时会自动检测:如果没有权限,界面顶部会出现黄色提示条并给出 “以管理员身份重启” 按钮,点一下就带权限重启。
  3. 页数显示“待填”时请手填:少数打印机驱动不上报页数(返回 0)。这时收款弹窗里 页数框是空的,按实际页数填一下,金额会自动重算。程序绝不替你猜页数。
  4. 不要同时运行两个程序:程序做了单实例限制,第二个实例会提示退出, 避免同一个作业被收两次钱。
  5. 未登录 = 收费:这是设计行为。要免收费就用自己的管理员账号登录。
  6. 数据都在程序目录: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

下载后:

  1. 解压到任意目录(建议纯英文路径,例如 D:\PrintPay);
  2. 双击 PrintPay.exe,首次运行提示默认管理员 admin / admin123,请立刻改密码;
  3. 把自己的收款码图片放进 assets 文件夹:微信收款码命名 wechat_pay.png、支付宝收款码命名 alipay_pay.jpg (发行版里出于隐私考虑不含任何收款码图片,缺失时收款窗会提示你去哪放);
  4. 在“设置”里选择打印机、填单价和微信号,即可开始使用。

十一、许可协议

本项目采用 MIT License —— 你可以自由使用、修改、分发甚至商用,唯一要求是保留版权声明与许可声明; 作者不对软件做任何担保(详见 LICENSE)。

MIT License
Copyright (c) 2026 李相平 (GitHub: Lee041111)

About

Print shop billing assistant: monitors the Windows print queue, charges per page, and shows WeChat/Alipay payment QR codes (C++17 + Qt6 + winspool).

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages