2017-01-18 126 views
1

我能够通过使用WMI和ManagementEventWatcherWin32_PrintJob获得打印作业信息,但我似乎无法找到打印机名称。我也看过这个Win32_PrintJob文档,最接近打印机名称的是DriverName属性,但它是打印机驱动程序名称,而不是控制面板的设备和打印机中显示的打印机名称。如何从Win32_PrintJob的打印作业中获取打印机名称?

因此,正如标题所述,我如何从Win32_PrintJob打印作业中获取打印机名称?

这是我的部分代码,到目前为止获得打印作业:

public void PrintHelperInstance_OnPrintJobChange(object sender, EventArrivedEventArgs e) 
{ 
    ManagementBaseObject objProps = (ManagementBaseObject)e.NewEvent.Properties["TargetInstance"].Value; 

    string jobName = objProps["Document"].ToString(); 

    if (jobName == "Test Print Form") 
    { 
     if (!IsFoundPrintJob) 
     { 
      IsFoundPrintJob = true; 
     } 

     CurrentJobStatus = (string)objProps["JobStatus"]; 

     if (CurrentJobStatus != PreviousJobStatus) 
     { 
      uint jobId = (uint)objProps["JobId"]; 
      string jobPrinter = (string)objProps["DriverName"]; 
      string jobHost = (string)objProps["HostPrintQueue"]; 
      string jobStatus = (string)objProps["JobStatus"]; 

      PreviousJobStatus = CurrentJobStatus; 
     } 
    } 
} 

回答

1

您可以使用此代码:

// produce wmi query object 
ObjectQuery query = new ObjectQuery("SELECT * FROM Win32_Printer); 
// produce search object 
ManagementObjectSearcher search = new ManagementObjectSearcher(quer); 
// retrieve result collection 
ManagementObjectCollection restul = search.Get(); 
// iterate through all printers 
foreach(ManagementObject obj in result) 
{ 
    // now create your temp printer class 
    Dictionary<string, object> printerObj = new Dictionary<string, object>(); 
    if(obj.GetPropertyValue("Local").ToString().Equals("true")) 
    { 
     printerObj.Add("isLocal", true); 
     printerObj.Add("name", obj.GetPropertyValue("name").ToString()); 
    } 
    else 
    { 
     printerObj.Add("isLocal", false); 
     printerObj.Add("serverName", obj.GetPropertyValue("ServerName").ToString()); 
     printerObj.Add("shareName", obj.GetPropertyValue("ShareName").ToString()); 
    } 

    // create real printer object 
    PrintServer srv = ((bool)printerObj["isLocal")) ? new LocalPrintServer() : new PrintServer((string)printerObj["serverName"]); 
    PrintQueue queue = srv.GetPrintQueue(((bool)printerObj["isLocal")) ? (string)printerObj["name"] : (string)printerObj["shareName"]; 

    foreach(var job in queue.GetPrintJobInfoCollection()) 
    { 
     // check job info and if it matches, return printer name; 
    } 
} 
+0

谢谢你,我会尝试这个明天,因为我有另一回事今晚做。 –

相关问题