2017-01-18 6 views
1

Я могу получить информацию о задании на печать от Win32_PrintJob с помощью WMI и ManagementEventWatcher, но я не могу найти имя принтера. Я также посмотрел на эту документацию 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

Спасибо, я попробую это завтра, как у меня есть другая вещь, чтобы сделать сегодня. –