FindNextPrinterChangeNotification未命中事件

本文关键字:事件 FindNextPrinterChangeNotification | 更新日期: 2023-09-27 18:30:06

我正在使用FindFirstPrinterChangeNotificationFindNextPrinterChangeNotification来捕获打印事件。然而,我注意到FindNextPrinterChangeNotification并不能可靠地返回所有事件。我在这篇文章中发现了一个有同样问题的人。

基本上,当我调试我的程序时,或者像他在处理事件时建议的那样放入Sleep命令时,FindNextPrinterChangeNotification会跳过很多事件。此外,大多数时候我会得到很多SPOOLING状态事件,但会错过DELETED状态事件(有时我会得到,但大多数时候我做不到),尽管我已经将作业推送到队列中以供稍后处理。

有人也有这个问题吗?此外,我正在尝试Microsoft PDF打印机,NumberOfPages会随着SPOOLING事件的到来而增加,但NumberOfPagesPrinted不会。这是有意的吗?

编辑经过一些调查,这些事件实际上并没有消失。如果我调用另一个打印作业,则会触发以前的事件(包括以前打印作业的DELETING/DELETED状态)。你能告诉我出了什么问题吗?

以下是调用FindFirstPrinterChangeNotification:的代码

    //We got a valid Printer handle.  Let us register for change notification....
    _changeHandle = FindFirstPrinterChangeNotification(_printerHandle, (int)PRINTER_CHANGES.PRINTER_CHANGE_JOB, 0, _notifyOptions);
    // We have successfully registered for change notification.  Let us capture the handle...
    _mrEvent.SafeWaitHandle = new Microsoft.Win32.SafeHandles.SafeWaitHandle(_changeHandle, true);
    //Now, let us wait for change notification from the printer queue....
    _waitHandle = ThreadPool.RegisterWaitForSingleObject(_mrEvent, new WaitOrTimerCallback(PrinterNotifyWaitCallback), _mrEvent, -1, true);

这是针对FindNextPrinterChangeNotification:

    _notifyOptions.Count = 1;
    _notifyOptions.dwFlags = PRINTER_NOTIFY_OPTIONS_REFRESH;
    int pdwChange = 0;
    IntPtr pNotifyInfo = IntPtr.Zero;
    bool bResult = FindNextPrinterChangeNotification(_changeHandle, out pdwChange, _notifyOptions, out pNotifyInfo);

FindNextPrinterChangeNotification未命中事件

我遇到了同样的问题,然后我尝试了:

_waitHandle = ThreadPool.RegisterWaitForSingleObject(_mrEvent, new WaitOrTimerCallback(PrinterNotifyWaitCallback), _mrEvent, -1, true);    

带有:

_waitHandle = ThreadPool.RegisterWaitForSingleObject(_mrEvent, new WaitOrTimerCallback(PrinterNotifyWaitCallback), _mrEvent, -1, false);

(最后为false arg)并且现在似乎工作