用c#和WMI计算客户打印页数

问题描述:

目标就像我在主题中所说的那样。我知道有很多关于那个具体问题的文章,我尝试了所有这些。 但由于他们的不制定出对我来说,我现在试图找出为什么这个只是工作有时,有时什么也没有发生,虽然很多东西都打印出来。 所以这是我的代码,它现在应该等待打印一份工作,并告诉我这件事。而已。用c#和WMI计算客户打印页数

private void StartMonitor() 
    { 

     try 
     { 
      var opt = new ConnectionOptions { EnablePrivileges = true }; 

      var scope = new ManagementScope("root\\CIMV2", opt); 

      scope.Connect(); 

      var query = new WqlEventQuery("SELECT * FROM __InstanceOperationEvent WITHIN 60 WHERE TargetInstance ISA \"Win32_PrintJob\""); 

      var watcher = new ManagementEventWatcher(query); 

      Console.WriteLine("Ready to receive Printer Job events..."); 

      var pjEvent = watcher.WaitForNextEvent(); 

      if (pjEvent != null) Console.WriteLine("Event occured: " + pjEvent.Properties["PagesPrinted"]); 
     } 
     catch (ManagementException e) 
     { 
      Console.WriteLine(e.StackTrace); 
      Console.WriteLine(e.ErrorCode); 
      Console.WriteLine(e.ErrorInformation); 
      _Error = e.Message; 
      throw; 
     } 
    } 

要获得特定作业的打印页的进展情况,请尝试使用较小的轮询间隔,并使用EventArrivedEventHandler委托连接到WMI事件的异步方式处理输入的数据。

试试这个例子。

using System; 
using System.Collections.Generic; 
using System.Management; 
using System.Text; 


namespace GetWMI_Info 
{ 
    public class EventWatcherAsync 
    { 
     private void WmiEventHandler(object sender, EventArrivedEventArgs e) 
     { 
      Console.WriteLine("TargetInstance.Caption :   " + ((ManagementBaseObject)e.NewEvent.Properties["TargetInstance"].Value)["Caption"]); 
      Console.WriteLine("TargetInstance.JobStatus :  " + ((ManagementBaseObject)e.NewEvent.Properties["TargetInstance"].Value)["JobStatus"]); 
      Console.WriteLine("TargetInstance.PagesPrinted : " + ((ManagementBaseObject)e.NewEvent.Properties["TargetInstance"].Value)["PagesPrinted"]); 
      Console.WriteLine("TargetInstance.Status :   " + ((ManagementBaseObject)e.NewEvent.Properties["TargetInstance"].Value)["Status"]); 

     } 

     public EventWatcherAsync() 
     { 
      try 
      { 
       string ComputerName = "localhost"; 
       string WmiQuery; 
       ManagementEventWatcher Watcher; 
       ManagementScope Scope; 


       if (!ComputerName.Equals("localhost", StringComparison.OrdinalIgnoreCase)) 
       { 
        ConnectionOptions Conn = new ConnectionOptions(); 
        Conn.Username = ""; 
        Conn.Password = ""; 
        Conn.Authority = "ntlmdomain:DOMAIN"; 
        Scope = new ManagementScope(String.Format("\\\\{0}\\root\\CIMV2", ComputerName), Conn); 
       } 
       else 
        Scope = new ManagementScope(String.Format("\\\\{0}\\root\\CIMV2", ComputerName), null); 
       Scope.Connect(); 

       WmiQuery ="Select * From __InstanceOperationEvent Within 1 "+ 
       "Where TargetInstance ISA 'Win32_PrintJob' "; 

       Watcher = new ManagementEventWatcher(Scope, new EventQuery(WmiQuery)); 
       Watcher.EventArrived += new EventArrivedEventHandler(this.WmiEventHandler); 
       Watcher.Start(); 
       Console.Read(); 
       Watcher.Stop(); 
      } 
      catch (Exception e) 
      { 
       Console.WriteLine("Exception {0} Trace {1}", e.Message, e.StackTrace); 
      } 

     } 

     public static void Main(string[] args) 
     { 
      Console.WriteLine("Listening {0}", "__InstanceOperationEvent"); 
      Console.WriteLine("Press Enter to exit"); 
      EventWatcherAsync eventWatcher = new EventWatcherAsync(); 
      Console.Read(); 
     } 
    } 
} 
+0

有用,但在远程网络客户端时,共享网络打印机选择要打印,“TotalPages”为零,为什么? – Azarsa

要获取一份工作我会尝试监控__InstanceDeletionEvents打印的总页数,我相信在那个时候Win32_PrintJob.TotalPages应该准确地显示打印的页数(现在不能测试此权利,抱歉)。还有一个不错的选择,在这里:

Monitoring a Printer Queue from VB.NET

如果你看文章的评论中,笔者还建议监察JOB_WRITTEN事件得到的打印的总数量。

如果你想监控的大型打印作业的进度,尽量监控__InstanceModificationEvents一旦创建工作,是这样的:

Select * From __InstanceModificationEvent Within 1 
Where TargetInstance Isa "Win32_PrintJob" 
And TargetInstance.PagesPrinted > PreviousInstance.PagesPrinted 
+0

但在网络打印机中,TotalPages始终为零!为什么? – Azarsa