c# 實(shí)現(xiàn)打印機(jī)狀態(tài)查詢與阻塞打印
在使用winform編寫自動打印服務(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)行人工手動干預(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-09
10個(gè)C#程序員經(jīng)常用到的實(shí)用代碼片段
如果你是一個(gè)C#程序員,那么本文介紹的10個(gè)C#常用代碼片段一定會給你帶來幫助,從底層的資源操作,到上層的UI應(yīng)用,這些代碼也許能給你的開發(fā)節(jié)省不少時(shí)間。以下是原文:2015-09-09
c#中將uint值轉(zhuǎn)換成int的實(shí)例方法
在本文里小編給大家整理的是關(guān)于c#中將uint值轉(zhuǎn)換成int的實(shí)例方法,需要的朋友們學(xué)習(xí)參考下。2019-08-08
C# WinForm調(diào)用net core實(shí)現(xiàn)文件上傳接口
這篇文章主要為大家詳細(xì)介紹了C# WinForm如何調(diào)用net core實(shí)現(xiàn)文件上傳接口,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-04-04
C#實(shí)現(xiàn)在控制臺輸入密碼顯示星號的方法
這篇文章主要介紹了C#實(shí)現(xiàn)在控制臺輸入密碼顯示星號的方法,感興趣的小伙伴們可以參考一下2016-04-04
FtpHelper實(shí)現(xiàn)ftp服務(wù)器文件讀寫操作(C#)
這篇文章主要為大家詳細(xì)介紹了FtpHelper實(shí)現(xiàn)ftp服務(wù)器文件讀寫操作,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-03-03
WPF實(shí)現(xiàn)Table布局控件的示例代碼
這篇文章主要為大家詳細(xì)介紹了如何使用WPF實(shí)現(xiàn)Table布局控件,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-10-10

