我正在尝试捕获在本地网络中提交给打印机的每个打印作业。我想显示工作的一些属性,如工作名称,提交时间等。
我尝试了一个while循环,但它没有抓住我的打印作业,也许是因为它在线程正在睡觉时发生了。是否有可以注册和处理的事件?我不想花费所有的CPU资源来完成这个任务的infinetly循环。
我试过了:
public static void WritePrinterJobs()
{
while (true)
{
foreach (var job in LocalPrintServer.GetDefaultPrintQueue().GetPrintJobInfoCollection())
{
Console.WriteLine(job.Submitter + " " + job.TimeJobSubmitted.ToShortDateString());
}
Thread.Sleep(100);
}
}
修改 上面的代码实际上是有效的,如果它对您有效,则不需要降低级别,我的错误是没有正确配置默认打印机。
答案 0 :(得分:5)
我找到了解决方案。对于那些正在寻找处理打印作业事件的方法,请看一下:
FindFirstPrinterChangeNotification
还可以找到工作代码Monitoring print jobs
答案 1 :(得分:1)
尝试使用Windows管理工具。我们有活动和代表时无需轮询。有关解决方案,请参阅here。
答案 2 :(得分:0)
我尝试执行的要求与 Mert Akcakaya 在他的回答中建议的要求相同。一切正常,但是如果Windows服务 打印后台处理程序 停止运行,则可能会停止。
因此,我改为使用WMI
来实现。此 Codeproject 文章here
参考此文章,我编写了下面的一段代码,用于不断监视打印机作业。在这里,我只对打印作业Spooling
感兴趣。
internal void MonitorPrinterJobs()
{
try
{
Task.Run(async delegate
{
while (true)
{
string searchQuery = "SELECT * FROM Win32_PrintJob";
ManagementObjectSearcher searchPrintJobs = new ManagementObjectSearcher(searchQuery);
ManagementObjectCollection prntJobCollection = searchPrintJobs.Get();
foreach (ManagementObject prntJob in prntJobCollection)
{
string jobName = prntJob.Properties["Name"].Value.ToString();
string jobStatus = Convert.ToString(prntJob.Properties["JobStatus"]?.Value);
if (jobStatus == "Spooling")
{
// do job
}
}
await Task.Delay(100);
}
});
}
catch (Exception ex)
{
// handle exception
}
}