c# 實(shí)現(xiàn)打印機(jī)狀態(tài)查詢與阻塞打印
在使用winform編寫自動(dòng)打印服務(wù)的過程中,發(fā)現(xiàn)只要進(jìn)行了打印命令的調(diào)用,文檔就會進(jìn)入到打印等待隊(duì)列,如果打印機(jī)無法正常工作,則會影響到相關(guān)業(yè)務(wù)數(shù)據(jù)的正確轉(zhuǎn)換,所以需要檢查打印機(jī)的狀態(tài)來保障每次打印時(shí)打印機(jī)處于空閑狀態(tài),打印時(shí)隊(duì)列中也只能有一個(gè)文檔,本文是通過引用System.Management來實(shí)現(xiàn)對打印機(jī)狀態(tài)的查詢
打印機(jī)狀態(tài)獲取
enum PrinterStatus { 其他 = 1, 未知 = 2, 空閑 = 3, 打印 = 4, 預(yù)熱 = 5, 停止打印 = 6, 脫機(jī) = 7, } /// <summary> /// 獲取打印機(jī)的當(dāng)前狀態(tài) /// </summary> /// <param name="PrinterDevice">打印機(jī)設(shè)備名稱</param> /// <returns>打印機(jī)狀態(tài)</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; }
打印機(jī)脫機(jī)檢查
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; }
打印機(jī)阻塞隊(duì)列實(shí)現(xiàn)
這里主要是通過一個(gè)while循環(huán)來不停的獲取打印機(jī)的狀態(tài),空閑時(shí)才會進(jìn)行下一次打印,通過兩個(gè)標(biāo)志位來配合輪詢的外部介入退出
FinishWait標(biāo)志位是任務(wù)內(nèi)部的標(biāo)識,如果打印機(jī)檢查到了錯(cuò)誤狀態(tài)則進(jìn)行輪詢退出
GlobalInfo.IsGlobalExist標(biāo)志位是程序全局標(biāo)識,如果界面上通知用戶等待時(shí)間過長,可以進(jìn)行人工手動(dòng)干預(yù)退出
//檢查打印機(jī)狀態(tài) if (!CheckPrinter(PrintName)) { throw new PrintCheckException("打印機(jī)處于脫機(jī)狀態(tài)"); } PrinterStatus State = GetPrinterPrinterStatus(PrintName); if (State == PrinterStatus.空閑) { } else if (State == PrinterStatus.打印 || State == PrinterStatus.預(yù)熱) { //正在打印/預(yù)熱時(shí)循環(huán)去查詢打印機(jī)狀態(tài),如果變成了就緒就開始打印 while (State != PrinterStatus.空閑 && !FinishWait && !GlobalInfo.IsGlobalExist) { State = GetPrinterPrinterStatus(PrintName); if (!CheckPrinter(PrintName)) { FinishWait = true; throw new PrintCheckException("打印機(jī)處于脫機(jī)狀態(tài)"); } if (State == PrinterStatus.打印 || State == PrinterStatus.預(yù)熱 || State == PrinterStatus.空閑) { if (State == PrinterStatus.空閑) { FinishWait = true; } } else { FinishWait = true; throw new PrintCheckException("打印機(jī)狀態(tài)錯(cuò)誤,當(dāng)前狀態(tài):" + State.ToString()); } }
以上就是c# 實(shí)現(xiàn)打印機(jī)狀態(tài)查詢與阻塞打印的詳細(xì)內(nèi)容,更多關(guān)于c# 打印機(jī)狀態(tài)查詢與阻塞打印的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C#?使用?Filestream?修改大文件指定位置數(shù)據(jù)
這篇文章主要介紹了C#?使用?Filestream修改大文件指定位置數(shù)據(jù),文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-09-0910個(gè)C#程序員經(jīng)常用到的實(shí)用代碼片段
如果你是一個(gè)C#程序員,那么本文介紹的10個(gè)C#常用代碼片段一定會給你帶來幫助,從底層的資源操作,到上層的UI應(yīng)用,這些代碼也許能給你的開發(fā)節(jié)省不少時(shí)間。以下是原文:2015-09-09c#中將uint值轉(zhuǎn)換成int的實(shí)例方法
在本文里小編給大家整理的是關(guān)于c#中將uint值轉(zhuǎn)換成int的實(shí)例方法,需要的朋友們學(xué)習(xí)參考下。2019-08-08C# WinForm調(diào)用net core實(shí)現(xiàn)文件上傳接口
這篇文章主要為大家詳細(xì)介紹了C# WinForm如何調(diào)用net core實(shí)現(xiàn)文件上傳接口,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-04-04C#實(shí)現(xiàn)在控制臺輸入密碼顯示星號的方法
這篇文章主要介紹了C#實(shí)現(xiàn)在控制臺輸入密碼顯示星號的方法,感興趣的小伙伴們可以參考一下2016-04-04FtpHelper實(shí)現(xiàn)ftp服務(wù)器文件讀寫操作(C#)
這篇文章主要為大家詳細(xì)介紹了FtpHelper實(shí)現(xiàn)ftp服務(wù)器文件讀寫操作,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-03-03WPF實(shí)現(xiàn)Table布局控件的示例代碼
這篇文章主要為大家詳細(xì)介紹了如何使用WPF實(shí)現(xiàn)Table布局控件,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-10-10