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

这篇具有很好参考价值的文章主要介绍了C# 实现打印机队列监控Win32_PrintJob,Win32_Printer。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

先上效果图

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去获取

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


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的状态更多是打印错误的状态,详情请阅读微软官方文档。

C# 实现打印机队列监控Win32_PrintJob,Win32_Printer文章来源地址https://www.toymoban.com/news/detail-442912.html

到了这里,关于C# 实现打印机队列监控Win32_PrintJob,Win32_Printer的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 解决:Win11无法连接网络打印机

    (一)打开本地组策略。         1.1 按win+R键盘组合键打开“运行”。在运行框中输入 “ gpedit.msc ”,回车键。         1.2 “开始”菜单中搜索:组策略,然后出现【编辑组策略】,点击进入。  (二)管理模板 -- 打印机 -- 配置RPC连接设置。双击打开  (三)勾选【

    2024年02月17日
    浏览(105)
  • win10打印机拒绝访问解决方法

           一直以来 , 在安装使用共享打印机打印一些文件的时候,会遇到错误提示:“无法访问 . 你可能没有权限使用网络资源。请与这台服务器的管理员联系”的问题,那为什么共享打印机拒绝访问呢?别着急,下面为大家带来相关的解决方法。        默认情况下, Win

    2024年02月04日
    浏览(48)
  • Win10 电脑无法连接另外一台电脑的共享打印机提示Windows无法连接到打印机,拒绝访问

    Win10 专业版 Epson L1110打印机 电脑A共享自己的打印机 电脑B共享电脑A的打印机 电脑B连接电脑A的共享打印机提示Windows无法连接到打印机,拒绝访问 1.检查电脑A的配置(未解决)

    2024年02月11日
    浏览(62)
  • win10电脑搜索不到打印机?解决方法如下

    win10电脑搜索不到打印机怎么办?有的朋友想要为自己的win10系统添加打印机设备,但是发现搜索不到打印机,这可能是因为我们没有正常连接的问题,可以尝试检查连接并通过手动连接的方法来连接。 方法一 1、如果我们是有线打印机搜索不到,那么大概率是硬件问题。 2、

    2024年02月04日
    浏览(42)
  • win11共享打印机无法连接怎么办

    很多小伙伴都将电脑更新升级成Win11系统,当我们使用多台电脑却只有一台打印机时,就需要共享打印机却出现了Win11共享打印机无法连接的情况,遇到这种问题应该怎么解决呢,下面小编就给大家详细介绍一下Win11共享打印机无法连接的解决方法,大家感兴趣的话就来看看吧

    2023年04月12日
    浏览(51)
  • win11打印机共享怎么连接第二台电脑?

    我们在办公时经常需要用到打印机,将打印机连接上电脑就可以享受打印服务了。但是很多用户对win11系统还不熟悉,升级win11系统之后就不知道怎么操作了。今天小编要给大家介绍的就是win11打印机共享连接第二台电脑的操作方法。 win11打印机共享设置方法 1、打开win11的打印

    2024年02月15日
    浏览(47)
  • WINDOWS(WIN11)通过IP添加网络打印机

    点击添加设备 点击手动添加 使用IP地址或主机名添加打印机  选择TCP/IP设备,输入打印机地址 如果有正确驱动就安装,没有就取消。  通过手动设置添加本地打印机或网络打印机  选择端口 如果有打印机IP,就“使用现有的端口”;如果没有,就选择“创建新端口”。 根据

    2024年03月21日
    浏览(42)
  • Win10系统电脑连接打印机的操作方法教学

    Win10系统电脑连接打印机的操作方法教学分享,很多用户在办公的时候都会需要使用到打印机。用用户自己购买了打印机之后,不懂怎么去连接自己的电脑来进行使用的方法,接下来我们一起来看看Win10系统电脑连接打印机的操作方法分享吧。 Win10连接打印机的方法 1、首先我

    2024年02月08日
    浏览(58)
  • 玩转电脑|WIN10如何添加打印机扫描到电脑

    win10和win7 添加打印机扫描到电脑操作不一样,换了win10电脑后还是按照win7的方法进行添加,会发现win10系统添加京瓷6525FMP打印机的扫描地址时会出现链接错误,无法添加。 是因为win10需要设置SMB权限之后,即可添加地址簿。 1、控制面板 打开控制面板:【开始】-【windows 系统

    2024年02月12日
    浏览(41)
  • win11 22H2 连接共享打印机失败

    1.原因:这个问题应该是更新Windows系统导致! 2.解决方法:管理员身份打开cmd,执行下面三条指令,作用是修改注册表. 这里是引用[微软官方疑难解答](Windows 11用于打印的 RPC 连接更新 - Windows Client | Microsoft Learn)

    2024年02月11日
    浏览(65)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包