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# 打印机状态查询与阻塞打印的资料请关注脚本之家其它相关文章!

相关文章

  • C# salt+hash 加密

    C# salt+hash 加密

    本文主要介绍了C# salt+hash加密规则、C# salt产生伪随机数原理、hash原理、使用hash来加密的原因等等。具有一定的参考价值,下面跟着小编一起来看下吧
    2017-01-01
  • C#比较二个数组并找出相同或不同元素的方法

    C#比较二个数组并找出相同或不同元素的方法

    这篇文章主要介绍了C#比较二个数组并找出相同或不同元素的方法,涉及C#针对数组的交集、补集等集合操作相关技巧,非常简单实用,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-11-11
  • C#表达式和运算符详细解析

    C#表达式和运算符详细解析

    这篇文章主要介绍了C#表达式和运算符详细解析,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-07-07
  • C#并行编程之Task任务

    C#并行编程之Task任务

    这篇文章介绍了C#并行编程之Task任务,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-05-05
  • C#实现简易多人聊天室

    C#实现简易多人聊天室

    这篇文章主要为大家详细介绍了C#实现简易多人聊天室,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • VS里使用C#制作窗口应用的项目实践

    VS里使用C#制作窗口应用的项目实践

    C#窗体的频率使用特别高,本文主要介绍了VS里使用C#制作窗口应用的项目实践,具有一定的参考价值,感兴趣的可以了解一下
    2024-02-02
  • Unity3d实现Flappy Bird游戏

    Unity3d实现Flappy Bird游戏

    这篇文章主要为大家详细介绍了Unity3d实现Flappy Bird游戏,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-12-12
  • C# 调用exe传参,并获取打印值的实例

    C# 调用exe传参,并获取打印值的实例

    这篇文章主要介绍了C# 调用exe传参,并获取打印值的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-04-04
  • 深入理解C#中常见的委托

    深入理解C#中常见的委托

    这篇文章主要介绍了C# 委托(Delegate)的相关资料,文中讲解非常详细,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下,希望能够帮助到你
    2021-07-07
  • C#对JSON与对象的序列化与反序列化

    C#对JSON与对象的序列化与反序列化

    这篇文章介绍了C#对JSON与对象的序列化与反序列化,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-05-05

最新评论