Функция FindNextPrinterChangeNotification

Функция FindNextPrinterChangeNotification извлекает сведения о последнем уведомлении об изменениях для объекта уведомления об изменениях, связанного с принтером или сервером печати. Вызывайте эту функцию, если операция ожидания для объекта уведомления об изменениях выполнена.

Функция также сбрасывает объект уведомления об изменениях в состояние без сигнала. Затем объект можно использовать в другой операции ожидания, чтобы продолжить мониторинг принтера или сервера печати. Операционная система присвоит объекту состояние сигнала при следующем выполнении одного из указанных изменений на принтере или сервере печати. Функция FindFirstPrinterChangeNotification создает объект уведомления об изменениях и задает набор отслеживаемых изменений.

Синтаксис

BOOL FindNextPrinterChangeNotification(
  _In_      HANDLE hChange,
  _Out_opt_ PDWORD pdwChange,
  _In_opt_  LPVOID pPrinterNotifyOptions,
  _Out_opt_ LPVOID *ppPrinterNotifyInfo
);

Параметры

hChange [in]

Дескриптор объекта уведомления об изменениях, связанного с принтером или сервером печати. Такой дескриптор можно получить, вызвав функцию FindFirstPrinterChangeNotification . Операционная система устанавливает для этого объекта уведомления об изменениях состояние сигнала при обнаружении одного из изменений, указанных в фильтре уведомлений об изменениях объекта.

pdwChange [out, optional]

Указатель на переменную, биты которой задаются для указания изменений, которые привели к последнему уведомлению. Битовые флаги, которые могут быть заданы, соответствуют флагам, указанным в параметре fdwFilter вызова FindFirstPrinterChangeNotification . Система устанавливает один или несколько следующих битовых флагов.

Значение Значение
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_DELETE_PORT
Порт или монитор были удалены с сервера.
PRINTER_CHANGE_DELETE_PRINT_PROCESSOR
Обработчик печати был удален с сервера.
PRINTER_CHANGE_DELETE_PRINTER
Принтер удален.
PRINTER_CHANGE_DELETE_PRINTER_DRIVER
Драйвер принтера был удален с сервера.
PRINTER_CHANGE_FAILED_CONNECTION_PRINTER
Сбой подключения к принтеру.
PRINTER_CHANGE_SET_FORM
На сервере была задана форма.
PRINTER_CHANGE_SET_JOB
Задание задано.
PRINTER_CHANGE_SET_PRINTER
Установлен принтер.
PRINTER_CHANGE_SET_PRINTER_DRIVER
Установлен драйвер принтера.
PRINTER_CHANGE_WRITE_JOB
Данные задания были записаны.
PRINTER_CHANGE_TIMEOUT
Истекло время ожидания задания.
PRINTER_CHANGE_SERVER
Windows 7: на сервере произошло изменение.

pPrinterNotifyOptions [in, необязательный]

Указатель на структуру PRINTER_NOTIFY_OPTIONS . Задайте элементу Flags этой структуры значение PRINTER_NOTIFY_OPTIONS_REFRESH, чтобы функция возвращала текущие данные для всех отслеживаемых полей сведений о принтере. Функция игнорирует все остальные элементы структуры. Этот параметр может принимать значение NULL.

ppPrinterNotifyInfo [out, optional]

Указатель на переменную указателя, которая получает указатель на выделенный системой буфер только для чтения. Вызовите функцию FreePrinterNotifyInfo , чтобы освободить буфер после завершения работы с ним. Этот параметр может иметь значение NULL , если информация не требуется.

Буфер содержит структуру PRINTER_NOTIFY_INFO , которая содержит массив PRINTER_NOTIFY_INFO_DATA структур. Каждый элемент массива содержит сведения об одном из полей, указанных в параметре pPrinterNotifyOptions вызова FindFirstPrinterChangeNotification . Как правило, функция предоставляет данные только для полей, которые изменились, чтобы вызвать последнее уведомление. Однако если структура, на которую указывает параметр pPrinterNotifyOptions , указывает PRINTER_NOTIFY_OPTIONS_REFRESH, функция предоставляет данные для всех отслеживаемых полей.

Если бит PRINTER_NOTIFY_INFO_DISCARDED задан в элементе Flags структуры PRINTER_NOTIFY_INFO , произошло переполнение или ошибка, а уведомления могли быть потеряны. В этом случае дополнительные уведомления не будут отправляться, пока вы не выполните второй вызов FindNextPrinterChangeNotification , указывающий PRINTER_NOTIFY_OPTIONS_REFRESH.

Возвращаемое значение

Если функция выполняется успешно, возвращаемое значение будет ненулевым.

Если функция выполняется неудачно, возвращается нулевое значение.

Комментарии

Примечание

Это блокирующая или синхронная функция, возвращаемая не сразу. Скорость возврата этой функции зависит от факторов времени выполнения, таких как состояние сети, конфигурация сервера печати и факторы реализации драйвера принтера, которые трудно предсказать при написании приложения. Вызов этой функции из потока, который управляет взаимодействием с пользовательским интерфейсом, может привести к тому, что приложение не отвечает.

Вызовите функцию FindNextPrinterChangeNotification после выполнения операции ожидания для объекта уведомления, созданного Методом FindFirstPrinterChangeNotification . Вызов Метода FindNextPrinterChangeNotification позволяет получить сведения об изменениях, удовлетворяющих операции ожидания, и сбрасывает объект уведомления, чтобы получить сигнал о следующем изменении.

За одним исключением не вызывайте функцию FindNextPrinterChangeNotification , если объект уведомления об изменениях не находится в состоянии сигнала. Если функция ожидания возвращает значение WAIT_TIMEOUT, объект изменения не находится в состоянии сигнала. Вызывайте функцию FindNextPrinterChangeNotification , только если функция ожидания завершается успешно без истечения времени ожидания. Исключением является вызов FindNextPrinterChangeNotification с PRINTER_NOTIFY_OPTIONS_REFRESH битом, заданным в параметре pPrinterNotifyOptions . Обратите внимание, что даже если этот флаг установлен, флаг PRINTER_NOTIFY_INFO_DISCARDED по-прежнему можно задать в параметре ppPrinterNotifyInfo .

Чтобы продолжить мониторинг изменений на принтере или сервере печати, повторите цикл вызова одной из функций ожидания , а затем вызовите функцию FindNextPrinterChangeNotification для проверки изменения и сброса объекта уведомления.

FindNextPrinterChangeNotification может объединить несколько изменений в одном поле сведений о принтере в одно уведомление. В этом случае функция обычно сворачивает все изменения для поля в одну запись в массиве структур PRINTER_NOTIFY_INFO_DATA в ppPrinterNotifyInfo; одна запись сообщает только самые актуальные сведения. Однако для некоторых полей сведений о задании и принтере функция может возвращать несколько записей массива для одного поля. В этом случае последняя запись массива для поля сообщает о текущих данных, а предыдущие записи содержат данные для промежуточных этапов.

Если объект уведомления об изменениях больше не нужен, закройте его, вызвав функцию FindClosePrinterChangeNotification .

Примечание

В Windows XP с пакетом обновления 2 (SP2) и более поздних версий брандмауэр подключения к Интернету (ICF) по умолчанию блокирует порты принтеров, но можно включить исключение для общего доступа к файлам и печати. Если пользователь устанавливает подключение принтера к другому компьютеру, а исключение не включено, он не будет получать уведомления об изменении принтера с сервера. Администратор компьютера должен включить исключение.

Примеры

В следующем примере кода показано, как можно отслеживать состояние принтера с помощью этих функций.

// 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
        //  such as: 
        //
        // if (something happens) {
        //     bKeepMonitoring = false; 
        // }
        //
    }
    // Close Printer Change Notification handle when finished. 
    FindClosePrinterChangeNotification(chgObject);
} else {
    // Unable to open printer change notification handle 
    dwStatus = GetLastError();
}

Требования

Требование Значение
Минимальная версия клиента
Windows 2000 Professional [только классические приложения]
Минимальная версия сервера
Windows 2000 Server [только классические приложения]
Заголовок
Winspool.h (включая Windows.h)
Библиотека
Winspool.lib
DLL
Spoolss.dll

См. также раздел

Вывод на печать

Функции API очереди печати принтера

FindClosePrinterChangeNotification

FindFirstPrinterChangeNotification

PRINTER_NOTIFY_INFO

PRINTER_NOTIFY_INFO_DATA

PRINTER_NOTIFY_OPTIONS