Функция FindFirstPrinterChangeNotification

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

Вызов FindFirstPrinterChangeNotification указывает тип отслеживаемых изменений. Можно указать набор условий для отслеживания изменений, набор полей сведений о принтере для отслеживания или и то, и другое.

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

Синтаксис

HANDLE FindFirstPrinterChangeNotification(
  _In_     HANDLE hPrinter,
           DWORD  fdwFilter,
           DWORD  fdwOptions,
  _In_opt_ LPVOID pPrinterNotifyOptions
);

Параметры

hPrinter [in]

Дескриптор принтера или сервера печати, который требуется отслеживать. Используйте функцию OpenPrinter или AddPrinter , чтобы получить дескриптор принтера.

fdwFilter

Условия, которые приведут к переходу объекта уведомления об изменениях в состояние сигнала. Уведомление об изменении возникает при выполнении одного или нескольких указанных условий. Параметр fdwFilter может быть равен нулю, если значение pPrinterNotifyOptions не равно NULL.

Этот параметр может быть одним или несколькими из следующих значений.

Значение Значение
PRINTER_CHANGE_FORM
Уведомлять о любых изменениях в форме. Вы можете задать этот общий флаг или один или несколько из следующих конкретных флагов:
PRINTER_CHANGE_ADD_FORM
PRINTER_CHANGE_SET_FORM
PRINTER_CHANGE_DELETE_FORM
PRINTER_CHANGE_JOB
Уведомлять о любых изменениях в задании. Вы можете задать этот общий флаг или один или несколько из следующих конкретных флагов:
PRINTER_CHANGE_ADD_JOB
PRINTER_CHANGE_SET_JOB
PRINTER_CHANGE_DELETE_JOB
PRINTER_CHANGE_WRITE_JOB
PRINTER_CHANGE_PORT
Уведомлять о любых изменениях в порте. Вы можете задать этот общий флаг или один или несколько из следующих конкретных флагов:
PRINTER_CHANGE_ADD_PORT
PRINTER_CHANGE_CONFIGURE_PORT
PRINTER_CHANGE_DELETE_PORT
PRINTER_CHANGE_PRINT_PROCESSOR
Уведомлять обо всех изменениях в обработчике печати. Вы можете задать этот общий флаг или один или несколько из следующих конкретных флагов:
PRINTER_CHANGE_ADD_PRINT_PROCESSOR
PRINTER_CHANGE_DELETE_PRINT_PROCESSOR
PRINTER_CHANGE_PRINTER
Уведомлять обо всех изменениях принтера. Вы можете задать этот общий флаг или один или несколько из следующих конкретных флагов:
PRINTER_CHANGE_ADD_PRINTER
PRINTER_CHANGE_SET_PRINTER
PRINTER_CHANGE_DELETE_PRINTER
PRINTER_CHANGE_FAILED_CONNECTION_PRINTER
PRINTER_CHANGE_PRINTER_DRIVER
Уведомлять обо всех изменениях в драйвере принтера. Вы можете задать этот общий флаг или один или несколько из следующих конкретных флагов:
PRINTER_CHANGE_ADD_PRINTER_DRIVER
PRINTER_CHANGE_SET_PRINTER_DRIVER
PRINTER_CHANGE_DELETE_PRINTER_DRIVER
PRINTER_CHANGE_ALL
Уведомлять, если произошло какое-либо из указанных выше изменений.
PRINTER_CHANGE_SERVER
Windows 7: уведомлять о любых изменениях на сервере.
Этот флаг не включается в изменения, отслеживаемые путем установки значения PRINTER_CHANGE_ALL .

Описание более конкретных флагов в предыдущей таблице см. в разделе Функция FindNextPrinterChangeNotification .

fdwOptions

Флаг, определяющий категорию принтеров, для которых будут работать уведомления.

Значение Значение
PRINTER_NOTIFY_CATEGORY_ALL
0x001000
FindNextPrinterChangeNotification возвращает уведомления для двухмерных и трехмерных принтеров.
PRINTER_NOTIFY_CATEGORY_3D
0x002000
FindNextPrinterChangeNotification возвращает уведомления только для трехмерных принтеров.

Если этот флаг равен нулю (0), FindFirstPrinterChangeNotification будет работать только для двухмерных принтеров. Это значение по умолчанию.

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

Указатель на структуру PRINTER_NOTIFY_OPTIONS . Элемент pTypes этой структуры представляет собой массив одной или нескольких структур PRINTER_NOTIFY_OPTIONS_TYPE , каждая из которых задает поле сведений о принтере для отслеживания. Уведомление об изменении возникает при изменении одного или нескольких указанных полей. При изменении функция FindNextPrinterChangeNotification может получить сведения о новом принтере. Этот параметр может иметь значение NULL, если fdwFilter имеет значение ненулевое значение.

Список полей, которые можно отслеживать, см. в разделе PRINTER_NOTIFY_OPTIONS_TYPE.

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

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

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

Комментарии

Примечание

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

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

При вызове FindFirstPrinterChangeNotificationзначение fdwFilter должно быть ненулевым, или значение pPrinterNotifyOptions должно быть не равно NULL. Если указаны оба параметра, уведомления будут появляться для обоих.

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

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

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

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

FindFirstPrinterChangeNotification не будет отправлять уведомления об изменениях для трехмерных принтеров на серверные дескрипторы.

Примечание

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

Требования

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

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

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

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

FindClosePrinterChangeNotification

FindNextPrinterChangeNotification

OpenPrinter

PRINTER_NOTIFY_OPTIONS

PRINTER_NOTIFY_OPTIONS_TYPE