2016-07-28 88 views
0

我从Monitor jobs in a printer queue (.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.

回答

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处理程序:

 
Status: Spooling, Total Pages: 0 
Status: Printing, Total Pages: 1 
:只打印1页到我的虚拟打印机的

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); 
    } 
} 

控制台输出