我有一份申请,需要打印一张票。每一张票必须是独一无二的。该应用程序是windows窗体,完全用c#编写。对于我们的应用,我们使用的是三星ML-2525激光单色打印机。
流程基本上如下,操作员选择一个产品/票证(这是唯一的),然后按下一个按钮,它可以做两件事:
由于某些原因,每隔一段时间,需要打印的图像都不会发送到打印机。这是个罕见的病例,但确实发生了。
我试图使用Win32_Printer ( http://msdn.microsoft.com/en-us/library/Aa394363 )连接到打印机,但无法获得当前打印机的状态(在线、脱机、低墨粉、卡纸等)。我只能检查打印机是否存在,纸张大小是否正确安装。我尝试了类似于下面的代码,但是它没有工作
private string MonitorPrintJobWmi()
{
var jobMessage = String.Empty;
var scope = new ManagementScope(ManagementPath.DefaultPath);
scope.Connect();
var selectQuery = new SelectQuery { QueryString = @"select * from Win32_PrintJob" };
var objSearcher = new ManagementObjectSearcher(scope, selectQuery);
var objCollection = objSearcher.Get();
foreach (var job in objCollection)
{
if (job != null)
{
jobMessage += String.Format("{0} \r\n", job["Name"].ToString());
jobMessage += String.Format("{0} \r\n", job["JobId"].ToString());
_jobId = Convert.ToInt32(job["JobId"]);
jobMessage += String.Format("{0} \r\n", job["JobStatus"].ToString());
jobMessage += String.Format("{0} \r\n", job["Status"].ToString());
}
}
return jobMessage;
}
我试图为打印机获得一个API,但我没有得到它。顺便说一句,打印机的软件确实显示了窗口工具栏中的不同错误。
我的问题是,在如何连接打印机并检查打印是否成功方面,是否有人能引导我朝着正确的方向前进。
此外,如果有人知道一些其他特定的打印机,我可以完成这一点,即改变硬件。
谢谢,
发布于 2012-09-13 16:13:08
若要获取本地计算机上的打印队列列表,请尝试PrintServer的GetPrintQueues方法。
一旦有了与相关打印机关联的PrintQueue对象的实例,就可以使用它访问打印机的状态(IsOffline、IsPaperOut等)。此外,您还可以使用它获取给定队列(GetPrintJobInfoCollection)中的作业列表,然后允许您获取特定于作业的状态信息(IsInError、IsCompleted、IsBlocked等)。
希望这能有所帮助!
发布于 2017-03-09 23:15:13
尝试打印PrintDocument (System.Drawing.Printing)后,尝试检查打印作业的状态。
第一步:初始化printDocument。
第二步:从System.Drawing.Printing.PrinterSettings.InstalledPrinters.Cast<string>();
获取打印机名称
并将其复制到printerDocument.PrinterSettings.PrinterName中
第三步:试着打印和处理。
printerDocument.Print();
printerDocument.Dispose();
最后一步:在一个任务中运行检查(不要阻止UI线程)。
Task.Run(()=>{
if (!IsPrinterOk(printerDocument.PrinterSettings.PrinterName,checkTimeInMillisec))
{
// failed printing, do something...
}
});
以下是实现:
private bool IsPrinterOk(string name,int checkTimeInMillisec)
{
System.Collections.IList value = null;
do
{
//checkTimeInMillisec should be between 2000 and 5000
System.Threading.Thread.Sleep(checkTimeInMillisec);
// or use Timer with Threading.Monitor instead of thread sleep
using (System.Management.ManagementObjectSearcher searcher = new System.Management.ManagementObjectSearcher("SELECT * FROM Win32_PrintJob WHERE Name like '%" + name + "%'"))
{
value = null;
if (searcher.Get().Count == 0) // Number of pending document.
return true; // return because we haven't got any pending document.
else
{
foreach (System.Management.ManagementObject printer in searcher.Get())
{
value = printer.Properties.Cast<System.Management.PropertyData>().Where(p => p.Name.Equals("Status")).Select(p => p.Value).ToList();
break;
}
}
}
}
while (value.Contains("Printing") || value.Contains("UNKNOWN") || value.Contains("OK"));
return value.Contains("Error") ? false : true;
}
祝好运。
https://stackoverflow.com/questions/11769351
复制相似问题