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

(0)

相关推荐

  • C#使用控制台列出当前所有可用的打印机列表

    本文实例讲述了C#使用控制台列出当前所有可用打印机列表的方法.分享给大家供大家参考.具体如下: // The initial C# code for the WMI query was generated by WMI Code //Generator, Version 5.00, http://www.robvanderwoude.com/wmigen.php using System; using System.Management; using System.Collections; na

  • C#利用PrintDocument定制打印单据的小例子

    前言 本文是利用PrintDocument定制打印单据的小例子,仅供学习分享使用,如果不足之处,还请指正. 涉及知识点: PrintDocument :从 Windows 窗体应用程序打印时,定义一种可重用的可发送到打印机上的对象. PrintPreviewControl :表示 Windows 窗体应用程序打印预览的原始预览部分,没有任何对话框或按钮. Graphics :GDI+绘图对象 PrinterSettings:设置打印机属性,如:设置属性Copies,可以设置打印份数,默认为1,

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

    调用方法: string baseName = System.IO.Directory.GetCurrentDirectory(); // baseName+"/" // string fileName = @"C:\Users\59930\Desktop\20170605\WindowsFormsApp1\WindowsFormsApp1\WindowsFormsApp1\bin\x86\Debug\WindowsFormsApp1.exe"; string fi

  • c#使用Aspose打印文件的示例

    最近在研究winform打印文件,需要支持word,excel,ppt,pdf,图片这几种格式,不能依赖相关软件环境,研究后决定使用Aspose套件将相关文件全部转换成pdf后打印 WrodToPDF 使用Aspose.Word 11.9,需要配合licence文件破解 //去水印 string licenseFile = "Aspose.Words.lic"; if (File.Exists(licenseFile)) {     Aspose.Words.License licen

  • C#操作Word打印的示例

    话不多说,解释在代码注释中-- class PrintClass { #region 全局变量 private DataGridView datagrid;//需要打印的数据来源 private PageSetupDialog pagesetupdialog; private PrintPreviewDialog printpreviewdialog; int currentpageindex = 0;//当前页的编号 int rowcount = 0;//数据的行数 public Size P

  • C#实现扫描枪扫描二维码并打印(实例代码)

    1.使用usb口输入的扫描枪,这里实现使用了winform 首先创建一个CS文件 using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Runtime.InteropServices; using System.Text; namespace am_sign { class BardCodeHooK { public delegate voi

  • c# 获取已安装的打印机并调用打印文件

    C# 获取所有安装了的打印机代码如下: using System.Drawing.Printing; var printers = PrinterSettings.InstalledPrinters; foreach (var item in printers) { Console.WriteLine(item.ToString()); } C# 调用打印机打印文件,通常情况下,例如Word.Excel.PDF等可以使用一些对应的组件进行打印,另一个通用的方式是直接启用一个打印的进程进行打印.示

  • C# 获取打印机当前状态的方法

    要获得打印机的状态,应该定义一个联合. 复制代码 代码如下: enum PrinterStatus { 其他状态= 1, 未知, 空闲, 正在打印, 预热, 停止打印, 打印中, 离线} 其中的"正在打印"和"打印中"是同一个意思,至于为什么会是这样,目前还不知道. 在程序中添加System.Management的引用:using System.Management; 然后编写获取打印机状态的函数如下: 复制代码 代码如下: /// <summary> 

  • c# winform 解决PictureBox 无法打印全部图片的问题

    作者:沐汐 Vicky 出处:http://www.cnblogs.com/EasyInvoice 一.   问题描述 在页面使用PictureBox 加载资料图片后,点击"打印",只能打印图片首页,较大图片则无法全部打印. 二.   原因分析 PictureBox中打印图片时没有设置继续打印相关属性,因此每次只能打印第1页. 三.解决方法 PictureBox控件增加打印全部页面属性,如果为True,表示打印全部页面:如果为False,保留原有逻辑不变. 在打印全部页面时,将控件的图

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

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

  • PowerShell查询和删除打印任务操作代码实例

    适用于Windows 8.1或Server 2012 R2 Windows 8.1 和 Server 2012 R2上自带了一个PowerShell组件:"PrintManagement",它包含了所有管理本机和远程打印机的命令. 在之前的小技巧中,我们演示了如何读取打印机任务.每一个打印任务都有一个属性JobStatus ,用来表示该任务是否打印成功. 所有的状态可以这样获取: 复制代码 代码如下: PS> Import-Module PrintManagement   PS&

  • sql server查询语句阻塞优化性能

    在生产环境下,有时公司客服反映网页半天打不到,除了在浏览器按F12的Network响应来排查,确定web服务器无故障后.就需要检查数据库是否有出现阻塞 当时数据库的生产环境中主表数据量超过2000w,子表数据量超过1亿,且更新和新增频繁.再加上做了同步镜像,很消耗资源. 这时就要新建一个会话,大概需要了解以下几点: 1.当前活动会话量有多少? 2.会话运行时间? 3.会话之间有没有阻塞? 4.阻塞时间 ? 查询阻塞的方法有很多.有sql 2000 的sp_lock, 有sql 2005及以上的d

  • Vuex中实现数据状态查询与更改

    在vuex进行vue注入后即可在任一子组件中通过this.$store来访问vuex import store from './store' new Vue({ el: '#app', router, store, components: { App }, template: '<App/>' }) 1.在子组件中通过this.$store.state.变量名在子组件中访问state中某个变量的值 this.tabbarActive = this.$store.state.tabbarActi

  • postgresql数据库连接数和状态查询操作

    查看数据库的当前连接数和状态的几种方式: 只是能看出数据库服务是否正在运行和启动路径 pg_ctl status 统计当前postgresql相关进程数,在大体上可以估算数据库的连接数,非精准,但是目前最常用的 ps -ef |grep postgres |wc -l 包含本窗口的所有数据库连接数 SELECT count(*) FROM pg_stat_activity: 不包含本窗口的所有数据库连接数,其中pg_backend_pid()函数的意思是当前进程相关的后台进程ID SELECT

  • vuex状态管理数据状态查询与更改方式

    目录 状态管理数据状态查询与更改 1.main.js里引入状态管理 2.store的创建 vuex数据管理,组件数据一一对应 1.组件A:我们拿到图片数据源 2. vuex(首先要记得下载和安装vuex,此处省略) 3.组件B 大致效果 状态管理数据状态查询与更改 1.main.js里引入状态管理 import store from './store'  new Vue({   el: '#app',   router,   store,   components: { App },   tem

  • ORACLE 回收站当前状态查询整理

    回收站(Recycle Bin)从原理上来说就是一个数据字典表,放置用户删除(drop)掉的数据库对象信息.用户进行删除操作的对象并没有被数据库删除,仍然会占用空间.除非是由于用户手工进行Purge或者因为存储空间不够而被数据库清掉. 在Oracle 10g数据库中,引入了一个回收站(Recycle Bin)的数据库对象. 回收站,顾名思义,它就是存储被删掉的东西.从原理上来说就是一个数据字典表,放置用户删除(drop)掉的数据库对象信息.用户进行删除操作的对象并没有被数据库删除,仍然会占用空间

  • 打印机无法打印的故障处理

    "无法打印"大多是由于打印机使用.安装.设置不当造成的,病毒.打印机损坏.打印机端口有故障也会导致打印机无法打印.如果打印机在 Windows 9x中无法打印,可按如下步骤检查处理: 1.首先检查打印机是否处于联机状态,在大多数打印机上,"OnLine"按钮旁边都有一个指示联机状态的小灯,正常情况该联机指示灯应处于常亮状态.如果该指示灯不亮或处于闪烁状态,说明联机不正常.请检查打印机电源是否接通.打印机电源开关是否打开.打印机电缆是否正确连接等. 2.如果联机指示灯

  • 打印机无法准确打印字体的解决

    答:其实这是非常常见的打印机故障,引起这种故障的原因主要有以下几个. (1)如果要打印的文件页面中包含有许多特殊的字体,而使用的打印机型号又比较老,那么打印机内置的字库中就很可能没有要打印文件页面中所包含的那些特殊字体,从而导致这些特殊字体无法被打印机识别而更换字体打印.对于由这种原因引起的无法准确打印字体故障,可以尝试按照如下步骤来排除: 首先在系统桌面上的"开始"菜单中依次单击"设置→打印机",在随后弹出的打印机列表窗口中,用鼠标右键单击目标打印机图标,从弹出的

随机推荐