实现一个检测系统发出的打印队列文件,打印的状态,打印机状态的模块。

先上效果图

1.需要用到的技术

要用到Win32_PrintJob,Win32_Printer。

其中,Win32_Printer是打印机的各种状态和控制。

Win32_Printer 类 – Win32 apps | Microsoft Learn

Win32_PrintJob是打印队列的各种数据和状态。Win32_PrintJob 类 – Win32 apps | Microsoft Learn

需要用到using System.Management; 这个库如果没有,就使用NuGet去获取


2.核心实现

2.1获取系统默认打印机名称 

//获取操作系统默认打印机名称
public string GetDefPrinterName()
{
     //获取所有打印机信息
     string query = string.Format("SELECT * from Win32_Printer ");
     var searcher = new ManagementObjectSearcher(query);
     var printers = searcher.Get();
     string strState = "";
     foreach (var printer in printers)
     {
         if (bool.Parse(printer.Properties["Default"].Value.ToString()) == true)
         {
             defPrintName = printer.Properties["DeviceID"].Value.ToString();
         }
     }
     return defPrintName;
}

2.2获取系统默认打印机状态

public string GetPrintState()
{
   //获取所有打印机信息
   string query = string.Format("SELECT * from Win32_Printer");
   var searcher = new ManagementObjectSearcher(query);
   var printers = searcher.Get();
   string strState = "";
   string defPrintName = "";
   foreach (var printer in printers)
   {
       if (bool.Parse(printer.Properties["Default"].Value.ToString()) == true)
       {
           int status = Int32.Parse(printer.Properties["ExtendedPrinterStatus"].Value.ToString());
           strState = ExtendedPrinterStatus[status - 1];
           break;
       }
    }
    return strState;
}

这段代码写的不好,在select * from Win32_Printer这里是可以加上WHERE的。应该可以用  WHERE xxxName=”Default”的方式去筛选出默认打印机,代码更简介。

3.获取打印队列与打印状态

public List<PrintJob> GetPrintList()
{
    List<PrintJob> list = new List<PrintJob>();

    var query2 = "SELECT * FROM Win32_PrintJob";
    using (var searcher2 = new ManagementObjectSearcher(query2))
    {
        var collection = searcher2.Get();
        if (collection.Count > 0)
        {
            foreach (ManagementObject item in collection)
            {
                string str = item.Properties["DriverName"].Value.ToString();
                if (defPrintName.Contains(item.Properties["DriverName"].Value.ToString()))
                {
                    try
                    {
                        PrintJob job = new PrintJob();
                        job.Document = (string)item.Properties["Document"].Value;
                        job.JobId = Int32.Parse(item.Properties["JobId"].Value.ToString()).ToString();
                        job.TotalPages = item.Properties["PaperSize"].Value.ToString();
                        job.PagesPrinted = Int32.Parse(item.Properties["PagesPrinted"].Value.ToString()).ToString();
                        job.TotalPages = Int32.Parse(item.Properties["TotalPages"].Value.ToString()).ToString();
                        job.TimeSubmitted = item.Properties["TimeSubmitted"].Value.ToString();
                        //job.StatusMask = GetStatusMaskCh(Int32.Parse(item.Properties["StatusMask"].Value.ToString()));
                        if(item.Properties["JobStatus"].Value!=null)
                        {
                            job.JobStatus = item.Properties["JobStatus"].Value.ToString();
                        }
                        else
                        {
                            job.JobStatus = "";
                        }
                                
                        list.Add(job);
                    }
                    catch (Exception ex)
                    {

                    }

                }
            }
        }
    }

    return list;
}

这里的PrintJob是我自己创建的一个类,用来记录和传递我想要的状态的。请结合文章签名微软关于PrintJob的类的解释来看。我这里只是自己挑选了些我需要的出来。其余的均可采用上述代码中

item.Properties[“Document”].Value

的方式来获取。我的PrintJob类构建如下:

 public class PrintJob
    {
        /// <summary>
        /// 文件名称
        /// </summary>
        public string Document { get; set; }
        /// <summary>
        /// 打印序列
        /// </summary>
        public string JobId { get; set; }
        /// <summary>
        /// 打印机返回的状态中文描述字符串
        /// </summary>
        public string JobStatus { get; set; }
        /// <summary>
        /// 页面大小
        /// </summary>
        public string PaperSize { get; set; }
        /// <summary>
        /// 已打印页数
        /// </summary>
        public string PagesPrinted { get; set; }
        /// <summary>
        /// 总页数
        /// </summary>
        public string TotalPages { get; set; }
        /// <summary>
        /// 提交时间
        /// </summary>
        public string TimeSubmitted { get; set; }
        /// <summary>
        /// 状态
        /// </summary>
        public string StatusMask { get; set; }

    }

特别说明下JobStatus ,这个获取的是打印机返回的状态文本描述。JobStatus是人最容易看懂的打印状态。而StatusMask、Status的状态更多是打印错误的状态,详情请阅读微软官方文档。


版权声明:本文为chduguxue原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/chduguxue/article/details/127361552