feat: 初始功能
This commit is contained in:
119
Services/Printing/WindowsPrinterStatusReader.cs
Normal file
119
Services/Printing/WindowsPrinterStatusReader.cs
Normal file
@@ -0,0 +1,119 @@
|
||||
using CloudPrint.Client.Models;
|
||||
using System.Management;
|
||||
|
||||
namespace CloudPrint.Client.Services.Printing;
|
||||
|
||||
public sealed class WindowsPrinterStatusReader : IPrinterStatusReader
|
||||
{
|
||||
public PrinterStatusSnapshot Read(string printerName)
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(printerName))
|
||||
{
|
||||
return new PrinterStatusSnapshot { Status = PrinterStatus.Unknown, Message = "打印机名称为空" };
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
return ReadCore(printerName);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
return new PrinterStatusSnapshot
|
||||
{
|
||||
Status = PrinterStatus.Unknown,
|
||||
Message = $"状态读取失败:{ex.Message}"
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
private static PrinterStatusSnapshot ReadCore(string printerName)
|
||||
{
|
||||
using var searcher = new ManagementObjectSearcher(
|
||||
"SELECT Name, WorkOffline, PrinterStatus, DetectedErrorState FROM Win32_Printer");
|
||||
|
||||
foreach (ManagementObject printer in searcher.Get())
|
||||
{
|
||||
var name = Convert.ToString(printer["Name"]);
|
||||
if (!string.Equals(name, printerName, StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
var workOffline = Convert.ToBoolean(printer["WorkOffline"] ?? false);
|
||||
var printerStatus = Convert.ToUInt32(printer["PrinterStatus"] ?? 2u);
|
||||
var errorState = Convert.ToUInt32(printer["DetectedErrorState"] ?? 0u);
|
||||
var queueCount = CountQueueJobs(printerName);
|
||||
|
||||
var status = MapStatus(workOffline, printerStatus, errorState, queueCount);
|
||||
return new PrinterStatusSnapshot
|
||||
{
|
||||
Status = status,
|
||||
QueueCount = queueCount,
|
||||
Message = BuildMessage(workOffline, printerStatus, errorState)
|
||||
};
|
||||
}
|
||||
|
||||
return new PrinterStatusSnapshot
|
||||
{
|
||||
Status = PrinterStatus.Offline,
|
||||
Message = "未找到打印机"
|
||||
};
|
||||
}
|
||||
|
||||
private static int CountQueueJobs(string printerName)
|
||||
{
|
||||
var escapedName = printerName.Replace("\\", "\\\\", StringComparison.Ordinal).Replace("'", "''", StringComparison.Ordinal);
|
||||
using var searcher = new ManagementObjectSearcher($"SELECT Name FROM Win32_PrintJob WHERE Name LIKE '{escapedName},%'");
|
||||
return searcher.Get().Count;
|
||||
}
|
||||
|
||||
private static PrinterStatus MapStatus(bool workOffline, uint printerStatus, uint errorState, int queueCount)
|
||||
{
|
||||
if (workOffline || printerStatus == 7)
|
||||
{
|
||||
return PrinterStatus.Offline;
|
||||
}
|
||||
|
||||
if (errorState is >= 3 and <= 11 || printerStatus == 6)
|
||||
{
|
||||
return PrinterStatus.Error;
|
||||
}
|
||||
|
||||
if (printerStatus == 4 || queueCount > 0)
|
||||
{
|
||||
return PrinterStatus.Printing;
|
||||
}
|
||||
|
||||
return printerStatus == 3 ? PrinterStatus.Idle : PrinterStatus.Unknown;
|
||||
}
|
||||
|
||||
private static string BuildMessage(bool workOffline, uint printerStatus, uint errorState)
|
||||
{
|
||||
if (workOffline)
|
||||
{
|
||||
return "脱机";
|
||||
}
|
||||
|
||||
return errorState switch
|
||||
{
|
||||
3 => "缺纸",
|
||||
4 => "卡纸",
|
||||
5 => "碳粉不足",
|
||||
6 => "门打开",
|
||||
7 => "需要人工干预",
|
||||
8 => "离线",
|
||||
9 => "维修中",
|
||||
10 => "输出纸盘已满",
|
||||
11 => "缺纸",
|
||||
_ => printerStatus switch
|
||||
{
|
||||
3 => "就绪",
|
||||
4 => "打印中",
|
||||
5 => "预热中",
|
||||
6 => "已停止",
|
||||
7 => "离线",
|
||||
_ => string.Empty
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user