描述
FindNextPrinterChangeNotification功能检索与打印机或打印服务器相关联的更改通知对象的最新更改通知的信息。当对更改通知对象进行等待操作时,调用此函数。
该函数还将更改通知对象重置为未通知状态。然后,您可以在另一个等待操作中使用该对象来继续监视打印机或打印服务器。下一次打印机或打印服务器发生一组特定更改时,操作系统将将对象设置为信号状态。FindFirstPrinterChangeNotification函数创建更改通知对象,并指定要监视的更改集。
C++ 语法
BOOL FindNextPrinterChangeNotification( __in HANDLE hChange, __out PDWORD pdwChange, __in LPVOID pPrinterNotifyOptions, __out LPVOID *ppPrinterNotifyInfo ); |
PowerBASIC 语法
FUNCTION FindNextPrinterChangeNotification ( _ BYVAL hChange AS DWORD, _ BYREF pdwChange AS DWORD, _ BYREF pPrinterNotifyOptions AS ANY, _ BYREF ppPrinterNotifyInfo AS ANY _ ) AS LONG |
参数
hChange
[in]处理与打印机或打印服务器关联的更改通知对象。通过调用FindFirstPrinterChangeNotification函数获取这样的句柄。当操作系统检测到对象的更改通知过滤器中指定的更改之一时,操作系统将此更改通知对象设置为已通知状态。
pdwChange
[out]指向其位设置为指示发生的更改以导致最近通知的变量的指针。可能设置的位标志对应于FindFirstPrinterChangeNotification调用的fdwFlags参数中指定的位标志。系统设置以下一个或多个位标志。
PRINTER_CHANGE_ADD_FORM
一个表单被添加到服务器。
PRINTER_CHANGE_ADD_JOB
已将打印作业发送到打印机。
PRINTER_CHANGE_ADD_PORT
端口或监视器已添加到服务器。
PRINTER_CHANGE_ADD_PRINT_PROCESSOR
打印处理器已添加到服务器。
PRINTER_CHANGE_ADD_PRINTER
打印机已添加到服务器。
PRINTER_CHANGE_ADD_PRINTER_DRIVER
打印机驱动程序已添加到服务器。
PRINTER_CHANGE_CONFIGURE_PORT
在服务器上配置了一个端口。
PRINTER_CHANGE_DELETE_FORM
表单从服务器中删除。
PRINTER_CHANGE_DELETE_JOB
工作被删除。
PRINTER_CHANGE_SET_PRINTER
打印机设置好了
PRINTER_CHANGE_SET_PRINTER_DRIVER
打印机驱动程序已设置。
PRINTER_CHANGE_WRITE_JOB
工作数据已写入。
PRINTER_CHANGE_TIMEOUT
工作超时了。
pPrinterNotifyOptions
[in]指向PRINTER_NOTIFY_OPTIONS结构的指针。将此结构的Flags成员设置为PRINTER_NOTIFY_OPTIONS_REFRESH,以使该函数返回所有受监视的打印机信息字段的当前数据。该函数忽略结构的所有其他成员。此参数可以为NULL。
ppPrinterNotifyInfo
[out]指向一个指针变量的指针,该指针接收指向系统分配的只读缓冲区的指针。调用FreePrinterNotifyInfo函数来完成缓冲区的释放。如果不需要信息,此参数可以为NULL。
缓冲区包含PRINTER_NOTIFY_INFO结构,其中包含PRINTER_NOTIFY_INFO_DATA结构的数组。阵列的每个元素都包含有关FindFirstPrinterChangeNotification调用的pPrinterNotifyOptions参数中指定的一个字段的信息。通常,该函数仅为更改为导致最新通知的字段提供数据。但是,如果pPrinterNotifyOptions参数指向的结构指定了PRINTER_NOTIFY_OPTIONS_REFRESH,则该函数为所有受监视的字段提供数据。
如果在PRINTER_NOTIFY_INFO结构的旗成员中设置了PRINTER_NOTIFY_INFO_DISCARDED位,则会发生溢出或错误,通知可能已丢失。在这种情况下,在您进行第二次指定PRINTER_NOTIFY_OPTIONS_REFRESH的FindNextPrinterChangeNotification呼叫之前,不会再发送其他通知。
返回值
如果函数成功,则返回值为非零值。
如果函数失败,返回值为零。
备注
对FindFirstPrinterChangeNotification创建的通知对象进行等待操作后,调用FindNextPrinterChangeNotification函数。调用FindNextPrinterChangeNotification可以获取有关满足等待操作的更改的信息,并重置通知对象,以便在发生下一次更改时发出信号。
除了一个例外,如果更改通知对象不处于信号状态,请不要调用FindNextPrinterChangeNotification函数。如果wait函数返回值WAIT_TIMEOUT,则更改对象不处于信号状态。只有等待功能没有超时才能成功,才调用FindNextPrinterChangeNotification功能。当在pPrinterNotifyOptions参数中设置了PRINTER_NOTIFY_OPTIONS_REFRESH位时调用FindNextPrinterChangeNotification时出现异常。请注意,即使设置了该标志,仍然可以在ppPrinterNotifyInfo参数中设置PRINTER_NOTIFY_INFO_DISCARDED标志。
要继续监视打印机或打印服务器进行更改,请重复调用其中一个等待功能的循环,然后调用FindNextPrinterChangeNotification功能来检查更改并重置通知对象。
FindNextPrinterChangeNotification可以将同一打印机信息字段的多个更改合并到单个通知中。发生这种情况时,该函数通常会将ppPrinterNotifyInfo中的PRINTER_NOTIFY_INFO_DATA结构数组中的字段的所有更改折叠成单个条目。单个条目仅报告最新信息。但是,对于某些作业和打印机信息字段,该函数可以返回同一字段的多个数组条目。在这种情况下,该字段的最后一个数组条目报告当前数据,较早的条目包含中间阶段的数据。
当您不再需要更改通知对象时,通过调用FindClosePrinterChangeNotification功能将其关闭。
Windows XP SP2 / Vista:默认情况下,Internet连接防火墙(ICF)阻止打印机端口,但可以启用文件和打印共享的例外。如果用户将打印机连接到另一台机器,并且未启用该异常,则用户将不会从服务器接收打印机更改通知。机器管理员将必须启用异常。
以下代码示例说明了如何使用这些功能来监视打印机状态。
C++
// get change notification handle for the printer
chgObject = FindFirstPrinterChangeNotification( hPrinter, PRINTER_CHANGE_JOB, 0, NULL);
if (chgObject != INVALID_HANDLE_VALUE) {
while (bKeepMonitoring) {
// wait for the change notification
WaitForSingleObject(chgObject, INFINITE);
//
fcnreturn = FindNextPrinterChangeNotification(chgObject, pdwChange, NULL, NULL);
if (fcnreturn) {
// check value of *pdwChange and deal with the indicated change
}
// insert some mechanism to stop monitoring
// if (something happens) bKeepMontoring = false;
}
// close Printer Change Notification handle when finished.
FindClosePrinterChangeNotification(chgObject);
} else {
// unable to open printer change notification handle
dwStatus = GetLastError();
}
PowerrBASIC
' // get change notification handle for the printer
chgObject = FindFirstPrinterChangeNotification(hPrinter, %PRINTER_CHANGE_JOB, 0, BYVAL %NULL)
IF chgObject <> %INVALID_HANDLE_VALUE THEN
WHILE bKeepMonitoring
' // wait for the change notification
WaitForSingleObject(chgObject, %INFINITE)
' //
fcnreturn = FindNextPrinterChangeNotification(chgObject, pdwChange, BYVAL %NULL, BYVAL %NULL)
IF fcnreturn THEN
' // check value of pdwChange and deal with the indicated change
END IF
' // insert some mechanism to stop monitoring
' // if (something happens) bKeepMontoring = %FALSE
WEND
' // close Printer Change Notification handle when finished.
FindClosePrinterChangeNotification(chgObject)
ELSE
' // unable to open printer change notification handle
dwStatus = GetLastError()
END IF
引用文件 #INCLUDE Once
WinSpool.inc(包括Windows.inc)