0

我想在使用 C# 完成打印作业时得到通知

我正在使用 C# Winform。我想知道是否有一种方法可以在指定打印队列中完成打印作业时引发事件。我尝试了以下解决方案:

我目前正在从 WMI 轮询查询。它不可靠,因为它取决于查询的间隔。有时系统会在打印作业完成后删除 WMI 数据库中的数据条目,如果查询间隔较长,我可能会错过打印作业,而在较短的间隔内,我可能会增加过多的额外负载。

我还使用PrintQueue.GetPrintJobInfoCollection()了返回一个不引发事件的数组。PrintSystemJobInfo我必须定期查询它们的状态并导致与上面提到的相同的问题。

虽然我认为这里不需要我的杂乱代码,但无论如何我都会粘贴它。

public static PrintQueue GetPrintQueue(string printerName)
        {
            PrintQueue targetPrintQueue = null;
            using (LocalPrintServer printServer = new LocalPrintServer())
            {
                PrintQueueCollection printQueuesOnLocalServer =
                    printServer.GetPrintQueues(new[] {EnumeratedPrintQueueTypes.Local});
                targetPrintQueue =
                    (from PrintQueue printQueue in printQueuesOnLocalServer
                        where printQueue.Name == printerName
                        select printQueue).FirstOrDefault();
            }

            return targetPrintQueue;
        }

public static List<PrintSystemJobInfo> GetPrintJobs(string printerName)
        {
            PrintQueue targetPrintQueue = GetPrintQueue(printerName);
            if (targetPrintQueue != null)
            {
                targetPrintQueue.Refresh();
                return targetPrintQueue.GetPrintJobInfoCollection().ToList();
            }
            else
            {
                throw new Exception();
            }
        }

更多信息

我非常仔细地阅读了FindNextPrinterChangeNotification(至少我认为我已经足够小心了),发现没有任何迹象表明打印作业已经完成pdwChange,如果这个 api 确实满足我上面描述的要求,有人会提供更多关于实现的细节吗或一个例子或什么?

4

1 回答 1

0

为了实现打印事件处理,您应该使用FindFirstPrinterChangeNotification函数。

于 2019-08-26T07:12:20.773 回答