【发布时间】:2023-03-09 22:13:01
【问题描述】:
我有一个需要打印票证的应用程序。每张票必须是唯一的。该应用程序是 Windows 窗体,完全用 C# 编写。对于我们的应用,我们使用的是三星 ML-2525 激光单色打印机。
流程基本上如下,操作员选择一个产品/票(这是唯一的),然后按下一个按钮来做两件事:
- 连接到数据库并根据使用情况更新产品
- 打印票证(使用 System.Drawing 和 GDI+ 完成)
由于某种原因,每隔一段时间,需要打印的图像没有发送到打印机。这是一个罕见的情况,但它发生了。
我尝试使用 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,但无法获得它。顺便说一句,打印机的软件确实会在 windows 工具栏中显示不同的错误。
我的问题是,是否有人可以引导我了解如何连接打印机并检查打印是否成功。
此外,如果有人知道我可以在其中完成此操作的其他特定打印机(即更改硬件),那将很有帮助。
谢谢,
【问题讨论】:
-
我做到了,但是一些示例代码可以帮助您抢占先机。
-
@lopezbertoni 用谷歌搜索一下会告诉你如何在 C# 应用程序中使用这些链接方法...比如 codeproject.com/Articles/51085/…
-
您的方案是否允许您的“重印”按钮首先使后端的第一个“独特”产品无效,这样如果有人要展示它,它将被拒绝,从而防止滥用? (是带有条形码的东西吗?)
-
@tomfanning 我们考虑过,但是这会让 POS 的收银员多次重印同一张票(窃取)。即使这张票可能被拒绝,客户仍然支付了它,并且不知道收银员重新打印了它。这就是为什么我们认为与打印机通信是使操作更容易的关键。希望这可以帮助。是的,它是带有条形码的东西。
标签: c# winforms printing system.printing