Compartir a través de


Función FindNextPrinterChangeNotification

La función FindNextPrinterChangeNotification recupera información sobre la notificación de cambios más reciente de un objeto de notificación de cambio asociado a una impresora o servidor de impresión. Llame a esta función cuando se cumpla una operación de espera en el objeto de notificación de cambio.

La función también restablece el objeto de notificación de cambio al estado no señalado. A continuación, puede usar el objeto en otra operación de espera para continuar supervisando la impresora o el servidor de impresión. El sistema operativo establecerá el objeto en el estado señalado la próxima vez que se produzca uno de los cambios especificados en la impresora o en el servidor de impresión. La función FindFirstPrinterChangeNotification crea el objeto de notificación de cambio y especifica el conjunto de cambios que se van a supervisar.

Sintaxis

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

Parámetros

hChange [in]

Identificador de un objeto de notificación de cambio asociado a una impresora o servidor de impresión. Para obtener este identificador, llame a la función FindFirstPrinterChangeNotification . El sistema operativo establece este objeto de notificación de cambio en el estado señalado cuando detecta uno de los cambios especificados en el filtro de notificación de cambio del objeto.

pdwChange [out, optional]

Puntero a una variable cuyos bits se establecen para indicar los cambios que se produjeron para provocar la notificación más reciente. Las marcas de bits que se pueden establecer corresponden a las especificadas en el parámetro fdwFilter de la llamada FindFirstPrinterChangeNotification . El sistema establece una o varias de las marcas de bits siguientes.

Valor Significado
PRINTER_CHANGE_ADD_FORM
Se agregó un formulario al servidor.
PRINTER_CHANGE_ADD_JOB
Se envió un trabajo de impresión a la impresora.
PRINTER_CHANGE_ADD_PORT
Se agregó un puerto o monitor al servidor.
PRINTER_CHANGE_ADD_PRINT_PROCESSOR
Se agregó un procesador de impresión al servidor.
PRINTER_CHANGE_ADD_PRINTER
Se agregó una impresora al servidor.
PRINTER_CHANGE_ADD_PRINTER_DRIVER
Se agregó un controlador de impresora al servidor.
PRINTER_CHANGE_CONFIGURE_PORT
Se configuró un puerto en el servidor.
PRINTER_CHANGE_DELETE_FORM
Se eliminó un formulario del servidor.
PRINTER_CHANGE_DELETE_JOB
Se eliminó un trabajo.
PRINTER_CHANGE_DELETE_PORT
Se eliminó un puerto o monitor del servidor.
PRINTER_CHANGE_DELETE_PRINT_PROCESSOR
Se eliminó un procesador de impresión del servidor.
PRINTER_CHANGE_DELETE_PRINTER
Se eliminó una impresora.
PRINTER_CHANGE_DELETE_PRINTER_DRIVER
Se eliminó un controlador de impresora del servidor.
PRINTER_CHANGE_FAILED_CONNECTION_PRINTER
Error en una conexión de impresora.
PRINTER_CHANGE_SET_FORM
Se estableció un formulario en el servidor.
PRINTER_CHANGE_SET_JOB
Se estableció un trabajo.
PRINTER_CHANGE_SET_PRINTER
Se estableció una impresora.
PRINTER_CHANGE_SET_PRINTER_DRIVER
Se estableció un controlador de impresora.
PRINTER_CHANGE_WRITE_JOB
Se escribieron datos de trabajo.
PRINTER_CHANGE_TIMEOUT
Se agota el tiempo de espera del trabajo.
PRINTER_CHANGE_SERVER
Windows 7: se ha producido un cambio en el servidor.

pPrinterNotifyOptions [in, optional]

Puntero a una estructura de PRINTER_NOTIFY_OPTIONS . Establezca el miembro Flags de esta estructura en PRINTER_NOTIFY_OPTIONS_REFRESH, para que la función devuelva los datos actuales para todos los campos de información de impresora supervisados. La función omite todos los demás miembros de la estructura. Este parámetro puede ser NULL.

ppPrinterNotifyInfo [out, optional]

Puntero a una variable de puntero que recibe un puntero a un búfer de solo lectura asignado por el sistema. Llame a la función FreePrinterNotifyInfo para liberar el búfer cuando haya terminado con él. Este parámetro puede ser NULL si no se requiere información.

El búfer contiene una estructura PRINTER_NOTIFY_INFO , que contiene una matriz de estructuras de PRINTER_NOTIFY_INFO_DATA . Cada elemento de la matriz contiene información sobre uno de los campos especificados en el parámetro pPrinterNotifyOptions de la llamada FindFirstPrinterChangeNotification . Normalmente, la función proporciona datos solo para los campos que cambiaron para provocar la notificación más reciente. Sin embargo, si la estructura a la que apunta el parámetro pPrinterNotifyOptions especifica PRINTER_NOTIFY_OPTIONS_REFRESH, la función proporciona datos para todos los campos supervisados.

Si el bit de PRINTER_NOTIFY_INFO_DISCARDED se establece en el miembro Flags de la estructura PRINTER_NOTIFY_INFO , se ha producido un desbordamiento o error y es posible que se hayan perdido las notificaciones. En este caso, no se enviará ninguna notificación adicional hasta que realice una segunda llamada FindNextPrinterChangeNotification que especifique PRINTER_NOTIFY_OPTIONS_REFRESH.

Valor devuelto

Si la función se ejecuta correctamente, el valor devuelto es un valor distinto de cero.

Si la función no se realiza correctamente, el valor devuelto es cero.

Comentarios

Nota:

Se trata de una función de bloqueo o sincrónica que podría no devolverse inmediatamente. La rapidez con la que devuelve esta función depende de factores en tiempo de ejecución, como el estado de red, la configuración del servidor de impresión y los factores de implementación del controlador de impresora que son difíciles de predecir al escribir una aplicación. Llamar a esta función desde un subproceso que administra la interacción con la interfaz de usuario podría hacer que la aplicación parezca que no responde.

Llame a la función FindNextPrinterChangeNotification después de que se haya cumplido una operación de espera en un objeto de notificación creado por FindFirstPrinterChangeNotification . Llamar a FindNextPrinterChangeNotification le permite obtener información sobre el cambio que cumplió la operación de espera y restablece el objeto de notificación para que se pueda indicar cuando se produzca el siguiente cambio.

Con una excepción, no llame a la función FindNextPrinterChangeNotification si el objeto de notificación de cambio no está en el estado señalado. Si una función wait devuelve el valor WAIT_TIMEOUT, el objeto de cambio no está en estado señalado. Llame a la función FindNextPrinterChangeNotification solo si la función de espera se realiza correctamente sin que se agote el tiempo de espera. La excepción es cuando se llama a FindNextPrinterChangeNotification con el bit PRINTER_NOTIFY_OPTIONS_REFRESH establecido en el parámetro pPrinterNotifyOptions . Tenga en cuenta que, incluso cuando se establece esta marca, todavía es posible establecer la marca PRINTER_NOTIFY_INFO_DISCARDED en el parámetro ppPrinterNotifyInfo .

Para seguir supervisando la impresora o el servidor de impresión de los cambios, repita el ciclo de llamada a una de las funciones de espera y, a continuación, llame a la función FindNextPrinterChangeNotification para examinar el cambio y restablecer el objeto de notificación.

FindNextPrinterChangeNotification puede combinar varios cambios en el mismo campo de información de impresora en una sola notificación. Cuando esto ocurre, la función normalmente contrae todos los cambios del campo en una sola entrada de la matriz de estructuras de PRINTER_NOTIFY_INFO_DATA en ppPrinterNotifyInfo; la única entrada solo informa de la información más actual. Sin embargo, para algunos campos de información de trabajo e impresora, la función puede devolver varias entradas de matriz para el mismo campo. En este caso, la última entrada de matriz para el campo informa de los datos actuales y las entradas anteriores contienen los datos de las fases intermedias.

Cuando ya no necesite el objeto de notificación de cambio, ciérrelo llamando a la función FindClosePrinterChangeNotification .

Nota:

En Windows XP con Service Pack 2 (SP2) y versiones posteriores, el Firewall de conexión a Internet (ICF) bloquea los puertos de impresora de forma predeterminada, pero se puede habilitar una excepción para compartir archivos e impresión. Si un usuario realiza una conexión de impresora a otra máquina y la excepción no está habilitada, el usuario no recibirá notificaciones de cambio de impresora del servidor. Un administrador de la máquina tendrá que habilitar la excepción.

Ejemplos

En el ejemplo de código siguiente se muestra cómo puede supervisar el estado de la impresora mediante estas funciones.

// 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();
}

Requisitos

Requisito Value
Cliente mínimo compatible
Windows 2000 Professional [solo aplicaciones de escritorio]
Servidor mínimo compatible
Windows 2000 Server [solo aplicaciones de escritorio]
Encabezado
Winspool.h (incluye Windows.h)
Biblioteca
Winspool.lib
Archivo DLL
Spoolss.dll

Consulte también

Impresión

Funciones de la API del administrador de trabajos de impresión

FindClosePrinterChangeNotification

FindFirstPrinterChangeNotification

PRINTER_NOTIFY_INFO

PRINTER_NOTIFY_INFO_DATA

PRINTER_NOTIFY_OPTIONS