首页 文章

如何从Win32_PrintJob的打印作业中获取打印机名称?

提问于
浏览
1

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

因此,如 Headers 中所述,如何从 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 回答

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

相关问题