FindNextPrinterChangeNotification未命中事件
本文关键字:事件 FindNextPrinterChangeNotification | 更新日期: 2023-09-27 18:30:06
我正在使用FindFirstPrinterChangeNotification
和FindNextPrinterChangeNotification
来捕获打印事件。然而,我注意到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);
我遇到了同样的问题,然后我尝试了:
_waitHandle = ThreadPool.RegisterWaitForSingleObject(_mrEvent, new WaitOrTimerCallback(PrinterNotifyWaitCallback), _mrEvent, -1, true);
带有:
_waitHandle = ThreadPool.RegisterWaitForSingleObject(_mrEvent, new WaitOrTimerCallback(PrinterNotifyWaitCallback), _mrEvent, -1, false);
(最后为false arg)并且现在似乎工作