5

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

我尝试了一个while循环,但它没有捕捉到我的打印作业,可能是因为它发生在线程休眠时。有我可以注册和处理的事件吗?我不想将所有 CPU 资源都用于无限循环地执行此任务。

我试过这个:

public static void WritePrinterJobs()
    {
        while (true)
        {
            foreach (var job in LocalPrintServer.GetDefaultPrintQueue().GetPrintJobInfoCollection())
            {
                Console.WriteLine(job.Submitter + " " + job.TimeJobSubmitted.ToShortDateString());
            }
            Thread.Sleep(100);
        }
    }

编辑: 上面的代码实际上是有效的,如果它对你有用,你不需要去低级,我的错误是没有正确配置默认打印机。

4

2 回答 2

5

我找到了解决方案。对于那些正在寻找一种处理打印作业事件的方法的人,请看一下:

FindFirstPrinterChangeNotification

并且还可以找到一个工作代码监控打印作业

于 2012-04-19T14:09:08.040 回答
2

我有同样的要求,我尝试按照Mert Akcakaya在他的回答中提出的建议来实施。这一切正常,但如果 Windows 服务Print Spooler停止工作,可能会停止。

所以相反,我使用WMI. 此Codeproject文章在此处提供了详细说明

参考这篇文章,我写了一段下面的代码来持续监控打印机作业。这里我只对打印作业感兴趣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
            }
        }
于 2020-04-28T04:14:45.273 回答