如何将 v4 打印驱动程序与 c# windows 应用程序连接

Posted

技术标签:

【中文标题】如何将 v4 打印驱动程序与 c# windows 应用程序连接【英文标题】:How to connect v4 Print Driver with c# windows application 【发布时间】:2021-12-21 02:17:00 【问题描述】:

我想通过打印驱动程序将文档发送到我的 Windows 应用程序。 为了实现我构建 v4 打印驱动程序并能够在打印选项中获取驱动程序的功能。现在我想从打印驱动程序打开 Windows 应用程序。我无法找到连接方式。 Print Options 附上截图供您参考。在“打印”按钮上,我想在打印机选项中选择我的打印机驱动程序后打开我的 Windows 应用程序

【问题讨论】:

我很好奇您可以编写打印驱动程序(内核模式),但您无法在用户会话中从所述驱动程序启动进程。当然,在许多地方,您与实际驱动程序中的内部打印和假脱机体系结构进行交互时,您可以创建一个进程 另一种方法是注入和代理打印 API 已经使用V4 Print Driver和c++编写了打印驱动程序,并且能够看到“打印”中的选项,并获得了打印选项。我不知道如何实现这一目标 【参考方案1】:

从您的应用程序中,您无法直接连接到您的驱动程序。 Windows 不允许这样做。驱动程序将由打印后台处理程序服务调用,而不是由任何应用程序直接调用。但是,一旦收到打印数据,您的驱动程序就可以通过进程间通信与您的应用程序进行通信。

当您从任何应用程序打印文档时,应用程序通过调用 Windows API 提交打印作业,Windows spooler 会生成 XPS(取决于驱动程序和打印处理器)格式的假脱机数据并将其发送到您的驱动程序(假设您的驱动程序基于 XPSDrv 驱动程序),您的驱动程序处理数据或保存数据或将其写回假脱机程序,假脱机程序将使用特定端口监视器将数据发送到打印机。 您可以截取假脱机数据(XPS 或 PDF)并将其用于您的目的。 这是一种数据流路径:[![在此处输入图片描述][1]][1]

Spooler 生成的假脱机数据主要是 .OXPS 或 .XPS 格式,您将在驱动程序中收到这些数据,您可以将其保存到某个地方并通过进程间通信将消息发送回您的应用程序。 [1]:https://i.stack.imgur.com/tVHEW.png

【讨论】:

我想以其他方式发送文档。我从打印选项发送文档 ==» 我的打印机。当我选择我的打印机并单击打印按钮时,它应该调用我的 Windows 应用程序。当前它将打印服务并给出错误,即重新启动打印后台处理程序...我缺少一些打印机驱动程序和 Windows 应用程序之间的链接。我寻找那座桥。注意:我使用 xps 打印驱动程序 @developer410,您可以将文档从驱动程序发送到您的应用程序,但它将采用假脱机数据格式。 如果您发现任何文章您认为它可以帮助我走得更远,请分享。我已经尝试了所有可能的方法来将打印驱动程序连接到应用程序。出现以下错误“RP-LPT-XX 拥有的文档打印文档无法在打印机 PrintDriver 上打印。尝试再次打印文档,或重新启动打印后台处理程序。数据类型:RAW。后台打印文件的大小(以字节为单位): 489236。打印的字节数:0。文档中的总页数:6。打印的页数:0。客户端计算机:\\RP-LPT-XX。打印处理器返回的 Win32 错误代码:193。“ @developer410, (1) 我会从这里 (github.com/microsoft/Windows-driver-samples/tree/master/print/…) 获取示例代码并构建和安装驱动程序并将端口设置为文件端口 (2) 安装示例驱动程序后,提交通过任何应用程序执行打印作业,并确保它保存了假脱机数据。 (3) 我会在本地保存文件并在驱动程序中启动您的应用程序并提供文件信息。我希望这会有所帮助。

以上是关于如何将 v4 打印驱动程序与 c# windows 应用程序连接的主要内容,如果未能解决你的问题,请参考以下文章

Windows打印体系结构之Windows内置打印驱动程序

C#实现打印与打印预览功能

我们可以在 C# 中使用单独的线程从 Windows 应用程序打印吗?

C#开发中Windows域认证登录2016(扩展吉日嘎拉GPM系统V4.2)

如何在 C# 中以编程方式将 Windows 服务的启动类型更改为禁用

与 Windows 应用程序的客户端通信