我正在处理一些监视打印机队列的代码,然后使用事件信息收集有关作业的一些细节,包括#pages,orientation,是否为彩色以及请求了多少副本。
我使用Merrion Computing(现在是开源)的代码捕获事件;它处理互操作。
在Color的情况下,它应该存储在JOB_INFO_2.pDeviceMode.dmColor中;但无论我如何提交作业(使用打印机属性从多个应用程序打印的颜色或黑白,包括单词和adobe),它总是指示颜色。我通过该代码直接调试,并且互操作似乎是正确的,因此我使用事件中的JobId通过.NET查询打印系统的代码(如下);它包含与副本和颜色完全相同的设置。
int iJobId = e.PrintJob.JobId;
LocalPrintServer printServer = new LocalPrintServer();
PrintQueueCollection queueCollection = printServer.GetPrintQueues();
foreach (PrintQueue queue in queueCollection)
{
queue.Refresh();
if(queue.FullName.Equals(e.PrintJob.PrinterName,StringComparison.OrdinalIgnoreCase))
{
int? iPageCount;
PrintJobInfoCollection jobs = queue.GetPrintJobInfoCollection();
foreach(PrintSystemJobInfo job in jobs)
{
job.Refresh();
if(job.JobIdentifier==iJobId)
{
iPageCount = job.NumberOfPages;
}
}
//-- Found the Printer...
int? iCopyCount=queue.CurrentJobSettings.CurrentPrintTicket.CopyCount;
PageOrientation? eOrientation = queue.CurrentJobSettings.CurrentPrintTicket.PageOrientation;
OutputColor? eColor = queue.CurrentJobSettings.CurrentPrintTicket.OutputColor;
Debug.WriteLine("queue=" + queue.FullName + ", Copies=" + iCopyCount.Value + ",Color=" + eColor.ToString() + ", pagecount=" + "unk" /*iPageCount.Value*/ + ", Orientation=", eOrientation.ToString());
Debug.WriteLine("---");
}
}
有没有人看到过可靠的方法来检索特定打印机作业的副本数和页数(最好使用.NET)? 我
我确实发现这篇文章描述了同样类型的问题,但那里没有解决方案。
Determine current print job color using C#
还应注意,上述文章中的WMI代码也会返回颜色。
我启用了事件日志以进行打印(http://www.papercut.com/kb/Main/LogPrintJobsInEventViewer)。查看打印活动的细节;颜色设置符合预期" 2",表示灰度。
很明显,windows子系统正在接收请求的设置;但是,我使用WMI,System.Printing的命名空间或Merrion的打印监控库中的互操作来检索值是不成功的,其中值都表示作业是正确的页数和副本。
答案 0 :(得分:0)
是否可以获取为此打印生成的假脱机文件以检查它是否正在设置dmColor设置?
您从事件日志中获取的设置2对应于DMCOLOR_COLOR而非DMCOLOR_MONOCHROME,因此日志中的颜色设置似乎也认为它是颜色。
可能是打印机驱动程序在创建作业时将作业作为颜色提交时有点偷偷摸摸,但随后在假脱机中发送“设置设备设置”消息,将其更改为单色?如果是这样,假脱机文件中应该有一个SPT_DEVMODE记录。
查看本文以获取假脱机文件阅读器:http://www.codeproject.com/Articles/10586/EMF-Printer-Spool-File-Viewer
答案 1 :(得分:0)
您需要刷新慢跑,直到标志IsSpooling
变为假。
for (int i = 0; i < jobs.Count(); i++)
{
try
{
int timeOut = 20000;
var jobInfo = jobs.ElementAt(i);
while (jobInfo.IsSpooling && timeOut > 0)
{
Thread.Sleep(100);
timeOut-=100;
jobInfo.Refresh();
} var pages = Math.Max(jobInfo.NumberOfPages,jobInfo.NumberOfPagesPrinted);
}
}