从打印作业中获取总页数
本文关键字:获取 打印 作业 | 更新日期: 2023-09-27 17:59:16
我从打印机队列(.NET)中的监视器作业下载了此代码现在我想知道打印作业的总页数。我看到了评论并添加了这个代码:
if ( data[ i ].Field == (ushort)PRINTERJOBNOTIFICATIONTYPES.JOB_NOTIFY_FIELD_TOTAL_PAGES &&
data[ i ].Type == (ushort)PRINTERNOTIFICATIONTYPES.PRINTER_NOTIFY_TYPE )
{
uint pagesCount = data[ i ].NotifyData.adwData[ 0 ];
}
但我总是看错页面。我尝试使用"PrinterQueueWatch",总页数始终为0。
您可以始终使用Win32_PrintJob
类来获取打印作业,并且您可以从该打印作业中获取总页数。请记住,在打印作业状态从"后台打印"移动到"打印"(我在自己的代码中经历过这种情况)之后,总页数是可用的。
在我的例子中,我使用WMI来监视打印作业,在观察程序的EventArrived
事件处理程序上,我添加了一些代码行来获取打印作业的总页数。
试试这个:
public void PrintJobChange(object sender, EventArrivedEventArgs e)
{
ManagementBaseObject objProps = (ManagementBaseObject)e.NewEvent.Properties["TargetInstance"].Value;
...
string jobStatus = (string)objProps["JobStatus"];
uint totalPages = ((uint)objProps["TotalPages"]);
Console.WriteLine("Status: " + jobStatus + ", Total Pages: " + totalPages);
}
然后PrintJobChange
订阅EventArrived
处理程序:
public void MonitorPrintJobs()
{
string queryClassName = "__InstanceOperationEvent";
string queryCond = "TargetInstance ISA 'Win32_PrintJob'";
TimeSpan queryTimeSpan = new TimeSpan(1);
try
{
WqlEventQuery eventQuery = new WqlEventQuery(queryClassName, queryTimeSpan, queryCond);
ManagementEventWatcher watcher = new ManagementEventWatcher(eventQuery);
if (PrintJobChange != null)
{
watcher.EventArrived += PrintJobChange;
}
watcher.Start();
}
catch (Exception ex)
{
string msg = string.Format("Error monitoring print jobs. Exception {0} Trace {1}.",
ex.Message, ex.StackTrace);
MessageBox.Show(msg, "Error", MessageBoxButton.OK, MessageBoxImage.Error);
}
}
控制台输出只打印1页到我的虚拟打印机:
状态:后台打印,总页数:0状态:正在打印,总页数:1