问题标签 [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.
c# - 使用 C# 获取打印页数(系统范围)
我已经做了将近2天了,我还没有完成任何事情!!
我被分配编写一个程序来计算 Windows 操作系统上打印的页数。
据我所知,我需要拦截打印事件并在内部对其进行计数。我应该使用FindFirstPrinterChangeNotification
和FindNextPrinterChangeNotification
。
我已经分配了一个PrinterNotifyWaitCallback
带有以下签名的回调函数,当打印事件发生时它会多次触发。
问题:
我对为什么打印事件会PrinterNotifyWaitCallback
多次触发有一些线索,但是我无法区分这些多个回调中的实际打印回调事件,这显然与它有关,Object state
但是关于如何实现我的目标的文档为零,这是计数打印的页面。
问题:
- 如何区分实际打印回调以计算系统范围内
PrinterNotifyWaitCallback
的总打印页数? - 还有其他更好的方法来完成任务吗?
winapi - 涉及 splwow64.exe 时如何检测打印应用程序?
我们有一个打印驱动程序,它在驱动程序的 UI 模块中捕获打印 exe 的名称。它通过使用GetModuleFileName
函数来做到这一点。这在 64 位机器上打印 32 位之前效果很好。在这种情况下,Windows 调用 splwow64.exe 代表 32 位应用程序进行打印,因此GetModuleFileName
返回“splwow64.exe”作为打印应用程序,而不是实际执行打印的应用程序。
我们试图通过使用 Toolhelp32 API 捕获 splwow64.exe 的父进程来解决此问题,但这并不可靠,因为一旦第一个应用程序完成打印以服务其他应用程序,splwow64 就会保持加载状态。这意味着父进程可能是也可能不是实际打印的进程。到目前为止,我们一直找不到任何文件或命名管道或其他连接 splwow64 和打印应用程序的 IPC 对象。
Microsoft 发布了一个热修复程序 (KB2815716),它会导致 splwow64 在用户指定的超时期限后终止,但这并不能解决问题,因为只要调用它的第一个打印应用程序保持加载状态,splwow64.exe 就会无限期地保留在内存中。它完全忽略了热修复提供的超时。(我认为这是一个 Windows 错误。)
我的问题是这样的:
当它恰好是 32 位并且正在使用 splwow64.exe 时,我们需要一种可靠地确定正在打印的应用程序的方法。
该解决方案可以驻留在打印驱动程序或用户模式应用程序中——两者都可以。我们强烈不希望使用涉及 API 挂钩或代码注入的技术,因为这些操作往往会被防病毒软件标记。
c# - DeviceCapabilities 产生错误:数据无效
我想获取打印机的纸张来源、纸张尺寸等列表。我稍微修改了来自http://www.pinvoke.net/default.aspx/Enums/DeviceCapabilities.html?diff=y 的代码这些代码有时有效,有时不是。问题是 DeviceCapabilities(DeviceName, strPort, DeviceCapabilitiesFlags.DC_BINNAMES, (IntPtr)null, (IntPtr)null) 返回-1。最后一个错误是“数据无效” 重新启动计算机可能无法解决问题。一旦遇到问题,下一次也许可以,也许不行。
那么这里的问题是什么?
c# - FindNextPrinterChangeNotification misses events?
I am using FindFirstPrinterChangeNotification
and FindNextPrinterChangeNotification
to catch printing events. However I have noticed that FindNextPrinterChangeNotification
does not reliably returns all the events. I have found a guy with the same problem in this article.
Basically, when I debug my program, or put Sleep command like his suggestion when processing an event, FindNextPrinterChangeNotification
skips a lot of events. Also, most of the time I get a lot of SPOOLING status events but miss the DELETED status event (sometimes I get it, but most of the time I cannot), even though I already push the jobs to a Queue for later processing.
Does anyone have this problem too? Also, I am trying the Microsoft PDF Printer, The NumberOfPages
increases as the SPOOLING events come, but the NumberOfPagesPrinted
does not. Is it intended?
EDIT After some investigation, the events are not actually gone. If I call another print job, the previous events are fired (including the DELETING/DELETED status of previous print job). Can you please suggest what is the problem?
Here's the code for calling FindFirstPrinterChangeNotification
:
And this is for the FindNextPrinterChangeNotification
:
c# - 使用 C# 在 Windows Server 2012 R2 中打印 PCL 文件
是否有关于 Windows Server 2012 R2 的特定内容可以阻止使用以下方法打印 PCL 文件?
我使用我在网上找到的代码从下面的 url 生成一个 dll 文件(您可以向下滚动一点以查看 Abel 发布的答案)。 如何在 C# 中打印 pcl 文件?
我使用生成的库文件并使用以下代码打印文件
那段代码在普通的 Windows 操作系统上打印 pcl 文件,但是当我在 Windows Server 2012 R2 中尝试它时它没有打印。
我跟踪了打印作业,直到检查 C:\Windows\System32\spool\PRINTERS 并且我确实在打印作业消失之前短暂地看到了那里的打印作业,这是我所期望的。但在那之后什么都没有发生,除了机器急剧减速。
这里有一些可能会有所帮助的东西。1. 代码不能使用相同的文件再次打印,因为它“被另一个进程使用” 2. 所有打印机都已安装并使用正确的名称(字面意思是复制并粘贴名称) 3. 代码打印文件都来自Windows 7、8.1 和 10 上的打印服务器和本地安装的打印机。
请帮忙!
c++ - 在 64 位 Windows 10 上运行 32 位应用程序时模拟后 DocumentProperties 调用被拒绝访问
在我的应用程序模拟用户后,我需要获取打印机 DEVMODE 结构。只要我的体系结构与在 32 位操作系统上运行的 32 位应用程序的 Windows 体系结构相匹配,它就可以正常工作,反之亦然。但是,我对 DocumentProperties 的任何调用都失败,在 Windows 10 上出现错误代码:5(访问被拒绝),或者在 Windows 7 上模拟运行在 64 位操作系统上的应用程序的 32 位版本后出现 RPC 错误。不幸的是,由于需要与之交互的其他遗留应用程序,客户无法运行我的应用程序的 64 位版本。
有谁知道解决这个问题的方法?
这是一个演示该问题的小示例代码。您需要将其构建为 x86 应用程序并在 64 位操作系统上运行以查看问题。
c# - 打印后台处理程序 api 份数
我真的可以使用一些帮助,这是很多人在互联网上提出的问题。我有不同的设置,尝试了不同的测试方式,这非常令人沮丧。
第一个设置:
本地打印机
本地运行代码
从 pdf 或记事本打印:SUCCES(份数为 2)
从 word 打印:失败(份数为 1)
第二种设置:
共享的本地打印机
本地运行代码
从其他计算机打印到共享打印机
份数始终为 1
那么每个人都缺少什么?在打印机仍然应该知道要打印什么的情况下缺少某些字段会发生什么?当您从另一台计算机打印时,也会出现什么单词?有人能告诉我为什么窗户里的东西这么可怕吗?一切都应该通过spooler,为什么数据是错误的?
亲切的问候!
c# - FindNextPrinterChangeNotification vs win32_printjob JobId
我正在尝试获取从 Windows(基于 AD)打印服务器生成的打印作业详细信息,该服务器为 100 多台客户端计算机提供服务。
由于我需要存储一些其他详细信息以及作业详细信息,因此使用 FindNextPrinterChangeNotification 在客户端获取 jobId 并将其传递给服务器上的 WMI 以获取更多作业详细信息。
请参阅http://www.codeproject.com/Articles/51085/Monitor-jobs-in-a-printer-queue-NET和https://blogs.msdn.microsoft.com/ocleon/2008/03/26 /get-print-jobs-using-wmi-and-managmentobjects/
但问题是我在服务器和客户端的同一工作中获得了不同的 ID(例如:29956 和 29)。
任何人都可以解释如何处理这两个 APIs 之间的 jobid 并为这个问题找到解决方案。
编辑 1:从域客户端计算机通过连接打印服务器 (\ipaddress) 并执行 FindNextPrinterChangeNotification 方法,获得作业信息详细信息 (jobid 29956)。但是在服务器上,通过对 wmi win32-printjob 类执行选择查询,根本没有产生任何结果,而我之前得到的是客户端本地打印作业 ID(29)。
任何人都可以通过在本地执行 wmi 查询来了解如何在打印服务器上获取作业详细信息。
java - 将控制数据添加到纯文本打印作业
很抱歉这个冗长的问题,我花了几天时间试图解决这个问题,到目前为止已经找到了几十种方法来解决我的问题。
我目前正在尝试使用Datamax
O'Neill E Class
Mark 3 打印机打印一些标签。生成标签数据的 java 应用程序不能轻易修改,只需通过内置的“打印”功能输出纯文本(下面的输出示例)
当我打印到理光打印机时,它可以工作(使用CR+LF
理光驱动程序中的替换)。但是,当我打印到标签打印机时,它不会。我被告知标签打印机需要“控制代码”和“编码数据”才能打印。
我已经能够从打印机记录.prn文件,并且当从记事本向打印机发送完全相同的数据时,.prn文件要大得多,并且似乎是包含控制代码的“编码”文件。
这完全是在 Windows 环境中使用网络打印机(也尝试过 USB)。我基本上需要一些东西让我的 Java 应用程序打印到,这将为数据添加必要的“编码”,然后将其传递给 Datamax 打印机。有任何想法吗?
明天当我在办公室时,我会尝试发布一些示例,因为我目前正在手机上输入此内容。
c# - 如何通过 Printername 和 JobID 暂停 Win32_printJob
任务
当用户打印文档时,将出现暂停弹出然后填写表格单击输入表格将关闭并且工作已恢复。
我们有 50 台网络打印机、2000 台客户端机器和一台打印服务器。
每个客户有3 或 4 台打印机
问题
如果用户在本地打印文档(例如:PDF PRINTER、XPS DOCUMENT WRITER)(或)使用网络打印机(CANON、HP),则打印作业立即暂停。
我的尝试
打印任何文档时,事件侦听器正在观察并返回打印作业。
在第一次暂停方法中有时会起作用,并且大部分时间都无法正常工作。因为,它正在搜索打印作业但它不存在已经打印。
在第二个暂停方法不起作用因为,事件侦听器返回 Managementbaseobject 但如果要暂停打印作业需要 ManagementObject 如何将 ManageBaseObject 转换为 ManageObject
打印作业事件侦听器代码
主要操作代码
暂停打印作业方法 1
暂停打印作业方法 2