實(shí)現(xiàn)一個(gè)檢測系統(tǒng)發(fā)出的打印隊(duì)列文件,打印的狀態(tài),打印機(jī)狀態(tài)的模塊。
先上效果圖
1.需要用到的技術(shù)
要用到Win32_PrintJob,Win32_Printer。
其中,Win32_Printer是打印機(jī)的各種狀態(tài)和控制。
Win32_Printer 類 - Win32 apps | Microsoft Learn
Win32_PrintJob是打印隊(duì)列的各種數(shù)據(jù)和狀態(tài)。Win32_PrintJob 類 - Win32 apps | Microsoft Learn
需要用到using System.Management; 這個(gè)庫如果沒有,就使用NuGet去獲取
2.核心實(shí)現(xiàn)
2.1獲取系統(tǒng)默認(rèn)打印機(jī)名稱?
//獲取操作系統(tǒng)默認(rèn)打印機(jī)名稱
public string GetDefPrinterName()
{
//獲取所有打印機(jī)信息
string query = string.Format("SELECT * from Win32_Printer ");
var searcher = new ManagementObjectSearcher(query);
var printers = searcher.Get();
string strState = "";
foreach (var printer in printers)
{
if (bool.Parse(printer.Properties["Default"].Value.ToString()) == true)
{
defPrintName = printer.Properties["DeviceID"].Value.ToString();
}
}
return defPrintName;
}
2.2獲取系統(tǒng)默認(rèn)打印機(jī)狀態(tài)
public string GetPrintState()
{
//獲取所有打印機(jī)信息
string query = string.Format("SELECT * from Win32_Printer");
var searcher = new ManagementObjectSearcher(query);
var printers = searcher.Get();
string strState = "";
string defPrintName = "";
foreach (var printer in printers)
{
if (bool.Parse(printer.Properties["Default"].Value.ToString()) == true)
{
int status = Int32.Parse(printer.Properties["ExtendedPrinterStatus"].Value.ToString());
strState = ExtendedPrinterStatus[status - 1];
break;
}
}
return strState;
}
這段代碼寫的不好,在select * from Win32_Printer這里是可以加上WHERE的。應(yīng)該可以用? WHERE xxxName="Default"的方式去篩選出默認(rèn)打印機(jī),代碼更簡介。
3.獲取打印隊(duì)列與打印狀態(tài)
public List<PrintJob> GetPrintList()
{
List<PrintJob> list = new List<PrintJob>();
var query2 = "SELECT * FROM Win32_PrintJob";
using (var searcher2 = new ManagementObjectSearcher(query2))
{
var collection = searcher2.Get();
if (collection.Count > 0)
{
foreach (ManagementObject item in collection)
{
string str = item.Properties["DriverName"].Value.ToString();
if (defPrintName.Contains(item.Properties["DriverName"].Value.ToString()))
{
try
{
PrintJob job = new PrintJob();
job.Document = (string)item.Properties["Document"].Value;
job.JobId = Int32.Parse(item.Properties["JobId"].Value.ToString()).ToString();
job.TotalPages = item.Properties["PaperSize"].Value.ToString();
job.PagesPrinted = Int32.Parse(item.Properties["PagesPrinted"].Value.ToString()).ToString();
job.TotalPages = Int32.Parse(item.Properties["TotalPages"].Value.ToString()).ToString();
job.TimeSubmitted = item.Properties["TimeSubmitted"].Value.ToString();
//job.StatusMask = GetStatusMaskCh(Int32.Parse(item.Properties["StatusMask"].Value.ToString()));
if(item.Properties["JobStatus"].Value!=null)
{
job.JobStatus = item.Properties["JobStatus"].Value.ToString();
}
else
{
job.JobStatus = "";
}
list.Add(job);
}
catch (Exception ex)
{
}
}
}
}
}
return list;
}
這里的PrintJob是我自己創(chuàng)建的一個(gè)類,用來記錄和傳遞我想要的狀態(tài)的。請結(jié)合文章簽名微軟關(guān)于PrintJob的類的解釋來看。我這里只是自己挑選了些我需要的出來。其余的均可采用上述代碼中
item.Properties["Document"].Value
的方式來獲取。我的PrintJob類構(gòu)建如下:
public class PrintJob
{
/// <summary>
/// 文件名稱
/// </summary>
public string Document { get; set; }
/// <summary>
/// 打印序列
/// </summary>
public string JobId { get; set; }
/// <summary>
/// 打印機(jī)返回的狀態(tài)中文描述字符串
/// </summary>
public string JobStatus { get; set; }
/// <summary>
/// 頁面大小
/// </summary>
public string PaperSize { get; set; }
/// <summary>
/// 已打印頁數(shù)
/// </summary>
public string PagesPrinted { get; set; }
/// <summary>
/// 總頁數(shù)
/// </summary>
public string TotalPages { get; set; }
/// <summary>
/// 提交時(shí)間
/// </summary>
public string TimeSubmitted { get; set; }
/// <summary>
/// 狀態(tài)
/// </summary>
public string StatusMask { get; set; }
}
特別說明下JobStatus ,這個(gè)獲取的是打印機(jī)返回的狀態(tài)文本描述。JobStatus是人最容易看懂的打印狀態(tài)。而StatusMask、Status的狀態(tài)更多是打印錯(cuò)誤的狀態(tài),詳情請閱讀微軟官方文檔。文章來源:http://www.zghlxwxcb.cn/news/detail-442912.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-442912.html
到了這里,關(guān)于C# 實(shí)現(xiàn)打印機(jī)隊(duì)列監(jiān)控Win32_PrintJob,Win32_Printer的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!