如何在C#.NET中捕获打印作业

时间:2012-04-19 13:24:23

标签: c# .net printing

我正在尝试捕获在本地网络中提交给打印机的每个打印作业。我想显示工作的一些属性,如工作名称,提交时间等。

我尝试了一个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);
        }
    }

修改 上面的代码实际上是有效的,如果它对您有效,则不需要降低级别,我的错误是没有正确配置默认打印机。

3 个答案:

答案 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
            }
        }