c# 实现打印机状态查询与阻塞打印

 更新时间:2021年05月10日 10:27:23   作者:code2roc  
这篇文章主要介绍了c# 引用System.Management来实现对打印机状态的查询,帮助大家更好的理解和学习使用c#,感兴趣的朋友可以了解下

在使用winform编写自动打印服务的过程中,发现只要进行了打印命令的调用,文档就会进入到打印等待队列,如果打印机无法正常工作,则会影响到相关业务数据的正确转换,所以需要检查打印机的状态来保障每次打印时打印机处于空闲状态,打印时队列中也只能有一个文档,本文是通过引用System.Management来实现对打印机状态的查询

打印机状态获取

enum PrinterStatus
        {
            其他 = 1,
            未知 = 2,
            空闲 = 3,
            打印 = 4,
            预热 = 5,
            停止打印 = 6,
            脱机 = 7,
        }

        /// <summary>
        /// 获取打印机的当前状态
        /// </summary>
        /// <param name="PrinterDevice">打印机设备名称</param>
        /// <returns>打印机状态</returns>
        private static PrinterStatus GetPrinterPrinterStatus(string PrinterDevice)
        {
            PrinterStatus ret = 0;
            string path = @"win32_printer.DeviceId='" + PrinterDevice + "'";
            ManagementObject printer = new ManagementObject(path);
            printer.Get();
            ret = (PrinterStatus)Convert.ToInt32(printer.Properties["PrinterStatus"].Value);
            return ret;
        }

打印机脱机检查

public static bool CheckPrinter(string BindPrintName)
        {
            ManagementScope scope = new ManagementScope(@"\root\cimv2");
            scope.Connect();

            // Select Printers from WMI Object Collections
            ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_Printer");

            string printerName = "";
            foreach (ManagementObject printer in searcher.Get())
            {
                printerName = printer["Name"].ToString().ToLower();
                if (printerName.IndexOf(BindPrintName.ToLower()) > -1)
                {
                    //foreach (var property in printer.Properties)
                    //{
                    //    LogUtil.WriteLog(property.Name + ":" + property.Value);
                    //}
                    if (printer["WorkOffline"].ToString().ToLower().Equals("true"))
                    {
                        return false;
                    }
                    else
                    {
                        return true;
                    }
                }
            }
            return false;
        }

打印机阻塞队列实现

这里主要是通过一个while循环来不停的获取打印机的状态,空闲时才会进行下一次打印,通过两个标志位来配合轮询的外部介入退出

FinishWait标志位是任务内部的标识,如果打印机检查到了错误状态则进行轮询退出

GlobalInfo.IsGlobalExist标志位是程序全局标识,如果界面上通知用户等待时间过长,可以进行人工手动干预退出

//检查打印机状态
                    if (!CheckPrinter(PrintName))
                    {
                        throw new PrintCheckException("打印机处于脱机状态");
                    }
                    PrinterStatus State = GetPrinterPrinterStatus(PrintName);
                    if (State == PrinterStatus.空闲)
                    {

                    }
                    else if (State == PrinterStatus.打印 || State == PrinterStatus.预热)
                    {
                        //正在打印/预热时循环去查询打印机状态,如果变成了就绪就开始打印
                        while (State != PrinterStatus.空闲 && !FinishWait && !GlobalInfo.IsGlobalExist)
                        {
                            State = GetPrinterPrinterStatus(PrintName);
                            if (!CheckPrinter(PrintName))
                            {
                                FinishWait = true;
                                throw new PrintCheckException("打印机处于脱机状态");
                            }
                            if (State == PrinterStatus.打印 || State == PrinterStatus.预热 || State == PrinterStatus.空闲)
                            {
                                if (State == PrinterStatus.空闲)
                                {

                                    FinishWait = true;
                                }
                            }
                            else
                            {
                                FinishWait = true;
                                throw new PrintCheckException("打印机状态错误,当前状态:" + State.ToString());
                            }
                        }

以上就是c# 实现打印机状态查询与阻塞打印的详细内容,更多关于c# 打印机状态查询与阻塞打印的资料请关注脚本之家其它相关文章!

相关文章

  • Unity接入百度AI实现货币识别

    Unity接入百度AI实现货币识别

    本文主要介绍了在Unity中接入百度AI,从而实现货币识别,可以返回货币的名称、代码、面值、年份信息等,感兴趣的可以跟随小编学习一下
    2022-01-01
  • C# 使用 Filestream 修改大文件指定位置数据

    C# 使用 Filestream 修改大文件指定位置数据

    这篇文章主要介绍了C# 使用 Filestream修改大文件指定位置数据,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-09-09
  • C#实现给图片添加文字水印的示例代码

    C#实现给图片添加文字水印的示例代码

    在某些应用项目中,查看电子图片信息是经常使用到的功能,此时我们就需要给显示在浏览器中的图片添加文字水印版权或提示信息,下面我们就来看看如何使用C#实现给图片添加文字水印吧
    2024-04-04
  • 10个C#程序员经常用到的实用代码片段

    10个C#程序员经常用到的实用代码片段

    如果你是一个C#程序员,那么本文介绍的10个C#常用代码片段一定会给你带来帮助,从底层的资源操作,到上层的UI应用,这些代码也许能给你的开发节省不少时间。以下是原文:
    2015-09-09
  • C#执行DOS命令的方法

    C#执行DOS命令的方法

    这篇文章主要介绍了C#执行DOS命令的方法,涉及针对进程的调用以及系统DOS命令的使用,具有不错的实用价值,需要的朋友可以参考下
    2014-11-11
  • c#中将uint值转换成int的实例方法

    c#中将uint值转换成int的实例方法

    在本文里小编给大家整理的是关于c#中将uint值转换成int的实例方法,需要的朋友们学习参考下。
    2019-08-08
  • C# WinForm调用net core实现文件上传接口

    C# WinForm调用net core实现文件上传接口

    这篇文章主要为大家详细介绍了C# WinForm如何调用net core实现文件上传接口,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-04-04
  • C#实现在控制台输入密码显示星号的方法

    C#实现在控制台输入密码显示星号的方法

    这篇文章主要介绍了C#实现在控制台输入密码显示星号的方法,感兴趣的小伙伴们可以参考一下
    2016-04-04
  • FtpHelper实现ftp服务器文件读写操作(C#)

    FtpHelper实现ftp服务器文件读写操作(C#)

    这篇文章主要为大家详细介绍了FtpHelper实现ftp服务器文件读写操作,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-03-03
  • WPF实现Table布局控件的示例代码

    WPF实现Table布局控件的示例代码

    这篇文章主要为大家详细介绍了如何使用WPF实现Table布局控件,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-10-10

最新评论