在 C++ 中捕获 windows 打印作业

Posted

技术标签:

【中文标题】在 C++ 中捕获 windows 打印作业【英文标题】:Catch windows print jobs in C++ 【发布时间】:2014-03-13 12:59:58 【问题描述】:

问题

我有一台连接到打印机的 Windows XP 电脑。这台电脑运行一个软件,我从中创建打印作业并将其发送到打印机。最近,打印机坏了,我没有办法买一台新的。该程序被配置为打印到这台特定的打印机,现在这是一个问题。

问题

有没有办法捕获发送到 Windows 打印后台处理程序的数据?根据我的发现,我必须开发一个打印监视器(.dll 文件将由 spooler.exe 读取,如果我错了,请纠正我),但是对于这样的问题,这似乎过于复杂了。我一直在搜索 Print Spooler API,但据我所见,GetJob 方法只返回有关打印作业的信息,而不是打印的实际数据。

我想捕获这些数据,然后在我自己制作的另一个程序中对其进行处理。这不是真正的问题,我更关心是否可以从打印后台处理程序中捕获数据,如果可能的话,我会提供一些提示。

谢谢。

【问题讨论】:

为什么不配置电脑打印成PDF? 如果您没有可用的打印机,为什么要“捕获”数据? @fritzone 无法打印到 PDF。不幸的是,这是一个非常封闭的系统。 我认为如果他们让您安装自定义 dll,他们也会让您安装 Bullzip PDF 打印机 ... @OMGtechy 我确实有一台可以工作的打印机,我忘了提这个。 【参考方案1】:

您的问题比您想象的要严重。将假脱机打印机数据传输到特定打印机的任务称为打印处理器,它位于打印监视器之前的打印机链中。此处的文档:http://msdn.microsoft.com/en-us/library/windows/hardware/ff551771%28v=vs.85%29.aspx

假脱机数据可以是几种不同格式中的一种,对于其中一些格式,可能无法重定向到不同类型的打印机。你没有提到你正在处理什么类型的打印机。

这是相当严肃的事情:编写和调试其中一个婴儿需要相当低级的技能和对 Windows 技术的理解。

编辑:数据很有可能是增强型元文件格式,您需要利用内置转换器将其转换为新打印机的命令。

【讨论】:

是的,我意识到它有点毛茸茸 :( 所以我写的打印监视器,实际上是我必须写的打印处理器? 如果没有更多信息,很难做出分类,但是是的,看起来确实如此。 我明白了。我将不得不找到另一种解决方案或让其他人开发它。谢谢

以上是关于在 C++ 中捕获 windows 打印作业的主要内容,如果未能解决你的问题,请参考以下文章

如何打印 C++ 中捕获的异常的堆栈跟踪和 C++ 中的代码注入

尝试使用 Win32 WASAPI C++ 中的“捕获流”创建 wav 文件

如何在 Win x64 上使用 WinAPI 正确安装虚拟打印机?

C++ Win32api 从用户输入输出 Unicode

如何在 Windows x64 C++ 应用程序中捕获堆栈溢出

Win32 API 打印不询问用户输入