问题标签 [print-spooler-api]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
985 浏览

c# - 如何使用 ReadPrinter 方法读取打印作业内容

我想获取发送到打印的文档内容。谷歌表示,唯一的方法是使用 WinAPI 方法 ReadPrinter()。我已经实现了一个草图,但无法让它工作。一个问题是 ReadPrinter() 方法总是什么都不返回。

请给我一个提示有什么问题。

简化代码如下:

P/Invoke 签名:

0 投票
0 回答
555 浏览

c++ - 调试自定义 Windows 打印处理器?

通过使用 Windows 驱动程序开发工具包示例包 (v 8.1),我找到了一个示例打印处理器实现,我尝试将其用作我自己的自定义打印处理器(“GenPrint 打印处理器示例”)的起点。我设法在 Visual Studio 2017 社区中成功构建它(将 PlatformToolset 更改为“v141”),并且我显然能够成功安装它(通过创建注册表项“HKLM:\SYSTEM\CurrentControlSet\Control\Print\Environments \Windows x64\Print Processors\genprint”,项目属性为“Driver”,值为“genprint.dll”,并将新构建的 dll 复制到 %WinDir%/System32/spool/prtprocs/x64/)。然后我可以设置一个测试打印机并使用打印机属性>高级>打印处理器选择我的“genprint”打印处理器...,我什至可以从 Visual Studio 中的调试器附加到假脱机进程 spoolsv,并在 EnumPrintProcessorDatatypesW(...) 中设置断点,当我为我的测试打印机重新打开“打印处理器”对话框时,它会被击中。到目前为止,一切都很好!

当我在其他任何地方设置断点并将实际作业排队到打印机队列时,问题就来了。在 OpenPrintProcessor(...) 的开头说。或者 PrintDocumentOnPrintProcessor(...),或者,你命名它。没什么,nada,zilch。似乎这些函数根本就没有被调用过,至少我的 DLL 导出的实现没有。我什至求助于在 DLL 导出的每个函数的开头插入事件日志 ala Event Tracing for Windows (ETW),但唯一生成的日志是 EnumPrintProcessorDatatypesW(...) 的日志。

地球上可能会发生什么?是否有可能,出于某种奇怪的原因,假脱机程序使用的打印处理器与我的不同,即使我明确地将我的打印队列与相关的打印队列相关联?如果是这样,为什么?

[更新:看起来我看到的行为归结为“打印驱动程序隔离”;当我将与队列关联的驱动程序的隔离模式更改为“无”时,我可以附加到 spoolsv 进程。否则,我的打印处理器将在一个单独的进程中运行,通过 DCOM 与 spoolsv 通信,如下所述:https ://blogs.technet.microsoft.com/askperf/2009/10/08/windows-7-windows-server-2008 -r2-print-driver-isolation/ ——我猜自 Windows 7 以来,系统范围的默认设置已更改为使用打印驱动程序隔离,除非您将驱动程序显式配置为“无”(或者它自行配置为方法)]

0 投票
1 回答
615 浏览

c++ - 带有 GetConfigInfo 的 XcvData 失败

我正在尝试使用 XcvData 读取打印机端口配置,但它失败并出现错误 87(无效参数)。添加端口或设置端口配置我没有问题。我已经看到了一些 c# 代码示例,它们完全符合我的要求,所以我不确定是什么导致了失败。任何建议将不胜感激。谢谢。

示例代码:

0 投票
0 回答
329 浏览

c# - Marshal.PtrToStringAnsi 不能在 Windows 服务中工作吗?

我编写了一个 dll,它调用 windows spooler api 来获取打印机名称和打印机驱动程序名称,它在控制台应用程序中运行良好。但是,当我在 Windows 服务应用程序中调用 dll 时,我什么也没得到。

这是我的dll源代码(即printerUtility):

LogWriter 源代码:

这是服务源代码:

在事件查看器中,我得到了打印机名称和打印机驱动程序名称的空字符串。但是,我发现 dll 返回打印机名称和打印机驱动程序名称的指针。因此,我怀疑 Marshal.PtrToStringAnsi 函数是否在窗口服务环境中不起作用。

在此处输入图像描述

在此处输入图像描述

0 投票
0 回答
909 浏览

c# - 打印假脱机 - 将文档保存到文件

我的用户从计算机上的不同打印机在 word、excel 或例如 ERP 系统等应用程序中打印文件(PDF、docx 等)。我需要将此文件复制到特定文件夹以将它们保存在存储中。

这是我当前的代码。

编辑

但是如何访问文档以将其保存到用户在打印时选择的文件格式的文件夹中?

开发语言不需要是 C# 或 C++。

0 投票
1 回答
4192 浏览

c# - 使用 Print Spooler API 监控打印作业

我正在尝试使用 C# 中的 Print Spooler API 获取打印作业的一些数据。为此,我使用了以下代码片段。(错误处理被删除)

(取自https://stackoverflow.com/a/3283918/3079364

为了解析从 GetJobs 返回的指针(printerData),我使用了以下类。

(PrinterInfo2)Marshal.PtrToStructure(printerData, typeof(PrinterInfo2)); 返回以下对象。我不熟悉 Windows apis 和 dll。可能我在创建解析器类时做错了。如何从 PtrToStructure 方法返回有意义的信息?

与stackoverflow GetJobs 相同

编辑:GetJobs 定义

编辑2:

我应用了 NetMage 的解决方案,但它也没有返回正确数量的 PagesPrinted 和 TotalPages。(它返回 PagesPrinted = 2,TotalPages = 0 应该是 PagesPrinted = 1,TotalPages = 2)然后我意识到,当我运行以下代码片段时,WMI 给出了相同的数字。

0 投票
1 回答
78 浏览

windows - 打印机将打印的每一页上的是/否对话框

我正在打印机服务器中执行此操作。我正在尝试制作一个程序,该程序将在继续打印由任何应用程序或从网络打印的页面之前显示“是/否”对话框。

到目前为止,暂停和恢复工作很容易。但是还没有找到暂停和恢复要打印的页面的解决方案。

作为参考,这里有更多关于在 Windows 上控制打印机 https://msdn.microsoft.com/en-us/library/windows/desktop/ff686805(v=vs.85).aspx

我正在使用 Windows 10 64 位。任何语言都可以。

谢谢。

0 投票
1 回答
3202 浏览

c - 使用 Windows Spooler API 以编程方式打印 PDF 文件

是否可以使用 Windows Spooler API 打印 PDF 文件。我尝试使用下面的代码,但它不工作......

WritePrinter 函数返回 SUCCESS 并且没有打印任何内容。使用此 API 打印 TXT 和 PRN 文件正在工作。

0 投票
1 回答
173 浏览

c++ - 打印作业时,最后一个作业状态是 JOB_STATUS_PAUSED,而不是 JOB_STATUS_PRINTED

我会在任何更改(如 JOB_CHANGE)上轮询打印机队列,如果我看到某个作业消失了,我会根据作业的最后状态向服务器报告该作业已被打印或删除。

问题是打印机 Kyocera M3550 作为最后一个状态 JOB_STATUS_PAUSED 返回,但没有 JOB_STATUS_DELETED 或 JOB_STATUS_PRINTED。

这些是我按升序排列的法规:

  • JOB_STATUS_SPOOLING
  • 0(不匹配任何已知状态)
  • JOB_STATUS_PASUED

这意味着什么?我不能将 JOB_STATUS_PASUED 作为我最后的状态,因为可能有人故意这样做。

0 投票
1 回答
461 浏览

c++ - C++ 端口监视器 (mfilemon.dll) RDP 虚拟通道代码未执行

我最近开始使用开源 mfilemon.dll 并尝试为其添加其他功能。

我要添加的功能是通过虚拟通道传输数据。我编写了一个小型控制台 exe 来测试代码,并且我在下面成功发送了数据(我在另一边收到一个消息弹出窗口)。

将此代码放入 mfilemon.dll 时,什么也没有发生。DLL 的所有其他功能都正常工作,但只是没有执行此代码。我认为 spooler 服务以及 Windows 中的某些东西正在阻止某些 API 调用,但很高兴知道。

这是我编写的 exe 代码,它成功地通过我的虚拟通道发送数据(我的项目是目标 Win8.1,所以我必须添加legacy_stdio_definitions.lib到链接器输入文件中)。

这是我的虚拟通道 DLL 代码。

定义文件:

主程序:

使用上述代码需要更改注册表,以便 mstsc.exe 知道加载此插件。

如果有人熟悉端口监视器并执行除创建文件之外的其他操作的代码,那将是膨胀的。