• C# 实现打印机队列监控Win32_PrintJob,Win32_Printer


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

    先上效果图

    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获取系统默认打印机名称 

    1. //获取操作系统默认打印机名称
    2. public string GetDefPrinterName()
    3. {
    4. //获取所有打印机信息
    5. string query = string.Format("SELECT * from Win32_Printer ");
    6. var searcher = new ManagementObjectSearcher(query);
    7. var printers = searcher.Get();
    8. string strState = "";
    9. foreach (var printer in printers)
    10. {
    11. if (bool.Parse(printer.Properties["Default"].Value.ToString()) == true)
    12. {
    13. defPrintName = printer.Properties["DeviceID"].Value.ToString();
    14. }
    15. }
    16. return defPrintName;
    17. }

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

    1. public string GetPrintState()
    2. {
    3. //获取所有打印机信息
    4. string query = string.Format("SELECT * from Win32_Printer");
    5. var searcher = new ManagementObjectSearcher(query);
    6. var printers = searcher.Get();
    7. string strState = "";
    8. string defPrintName = "";
    9. foreach (var printer in printers)
    10. {
    11. if (bool.Parse(printer.Properties["Default"].Value.ToString()) == true)
    12. {
    13. int status = Int32.Parse(printer.Properties["ExtendedPrinterStatus"].Value.ToString());
    14. strState = ExtendedPrinterStatus[status - 1];
    15. break;
    16. }
    17. }
    18. return strState;
    19. }

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

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

    1. public List GetPrintList()
    2. {
    3. List list = new List();
    4. var query2 = "SELECT * FROM Win32_PrintJob";
    5. using (var searcher2 = new ManagementObjectSearcher(query2))
    6. {
    7. var collection = searcher2.Get();
    8. if (collection.Count > 0)
    9. {
    10. foreach (ManagementObject item in collection)
    11. {
    12. string str = item.Properties["DriverName"].Value.ToString();
    13. if (defPrintName.Contains(item.Properties["DriverName"].Value.ToString()))
    14. {
    15. try
    16. {
    17. PrintJob job = new PrintJob();
    18. job.Document = (string)item.Properties["Document"].Value;
    19. job.JobId = Int32.Parse(item.Properties["JobId"].Value.ToString()).ToString();
    20. job.TotalPages = item.Properties["PaperSize"].Value.ToString();
    21. job.PagesPrinted = Int32.Parse(item.Properties["PagesPrinted"].Value.ToString()).ToString();
    22. job.TotalPages = Int32.Parse(item.Properties["TotalPages"].Value.ToString()).ToString();
    23. job.TimeSubmitted = item.Properties["TimeSubmitted"].Value.ToString();
    24. //job.StatusMask = GetStatusMaskCh(Int32.Parse(item.Properties["StatusMask"].Value.ToString()));
    25. if(item.Properties["JobStatus"].Value!=null)
    26. {
    27. job.JobStatus = item.Properties["JobStatus"].Value.ToString();
    28. }
    29. else
    30. {
    31. job.JobStatus = "";
    32. }
    33. list.Add(job);
    34. }
    35. catch (Exception ex)
    36. {
    37. }
    38. }
    39. }
    40. }
    41. }
    42. return list;
    43. }

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

    item.Properties["Document"].Value

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

    1. public class PrintJob
    2. {
    3. ///
    4. /// 文件名称
    5. ///
    6. public string Document { get; set; }
    7. ///
    8. /// 打印序列
    9. ///
    10. public string JobId { get; set; }
    11. ///
    12. /// 打印机返回的状态中文描述字符串
    13. ///
    14. public string JobStatus { get; set; }
    15. ///
    16. /// 页面大小
    17. ///
    18. public string PaperSize { get; set; }
    19. ///
    20. /// 已打印页数
    21. ///
    22. public string PagesPrinted { get; set; }
    23. ///
    24. /// 总页数
    25. ///
    26. public string TotalPages { get; set; }
    27. ///
    28. /// 提交时间
    29. ///
    30. public string TimeSubmitted { get; set; }
    31. ///
    32. /// 状态
    33. ///
    34. public string StatusMask { get; set; }
    35. }

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

  • 相关阅读:
    硬件时钟和系统时钟的同步机制及案例分享
    牛客前端宝典——刷题 ##Day8
    uniapp组件scroll-view水平滑动
    openstack wallaby 对应 需要的python版本 3.8.18
    websocket定时推送数据
    命令行下Git调用IDEA的diff功能
    CNVD-2023-08743:宏景HCM SQL注入漏洞复现 [附POC]
    秋招面经第八弹:网易二面-数据开发工程师
    2024年新算法-牛顿-拉夫逊优化算法(NRBO)优化BP神经网络回归预测
    大数据技术之Zookeeper总结Ⅰ
  • 原文地址:https://blog.csdn.net/chduguxue/article/details/127361552