feat: 初始功能

This commit is contained in:
Shiqvlizi Name
2026-05-23 18:16:50 +08:00
parent a5bfd8792e
commit 9a51259e9e
63 changed files with 5377 additions and 1 deletions

View 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
}
};
}
}