Compartir a través de


Informar a una aplicación de cambios en el árbol de elementos

Un minidriver para un dispositivo WIA debe ser capaz de informar a las aplicaciones asociadas a los dispositivos WIA de cualquier cambio en el árbol de elementos del dispositivo. Por ejemplo, si una aplicación muestra una interfaz de usuario que muestra miniaturas de las imágenes en una cámara, un minidriver WIA debería poder notificar a la interfaz de usuario de una aplicación que no muestre miniaturas de imágenes que el usuario ya ha eliminado.

La siguiente implementación de ejemplo del método IWiaMiniDrv::d rvDeviceCommand muestra cómo un minidriver WIA puede responder a un comando enviado por el servicio WIA y pasar el comando al dispositivo. Una vez que el minidriver WIA emite el comando al dispositivo, el minidriver informa a las aplicaciones de que el árbol de elementos del dispositivo ha cambiado. En esta implementación, el método determina que el servicio WIA ha emitido el comando "Tomar imagen" (WIA_CMD_TAKE_PICTURE). El método llama al método TakePicture en el elemento raíz (el elemento del dispositivo) e informa a las aplicaciones conectadas que el árbol de elementos ahora contiene la nueva imagen. (Tanto WIA_CMD_TAKE_PICTURE como TakePicture se describen en la documentación de Microsoft Windows SDK). El minidriver lo hace llamando a la función wiasQueueEvent.

Tenga en cuenta que cuando el minidriver envía el evento que indica que se ha actualizado el árbol, todas las aplicaciones de escucha se informan del cambio, no solo el autor de la llamada. Por ejemplo, si un usuario tiene abierta la vista Explorador de la cámara y usa Microsoft Paint para adquirir una nueva imagen, la ventana explorador también muestra la nueva imagen cuando llega, ya que escucha estos eventos.

En el ejemplo siguiente se muestra una implementación del método IWiaMiniDrv::d rvDeviceCommand .

HRESULT _stdcall CWIADevice::drvDeviceCommand(
  BYTE        *pWiasContext,
  LONG        lFlags,
  const GUID  *plCommand,
  IWiaDrvItem **ppWiaDrvItem,
  LONG        *plDevErrVal)
{
  //
  // If the caller did not pass in the correct parameters, 
  // then fail the call and return E_INVALIDARG.
  //

  if ((!pWiasContext)||(!plDevErrVal)||(!plCommand)) {
    return E_INVALIDARG;
  }

  *plDevErrVal = 0;
  HRESULT hr = E_NOTIMPL;

  //
  //  Check which command was issued
  //

  if (*plCommand == WIA_CMD_TAKE_PICTURE) {

    //
    // process command here
    //

      hr = HARDWARE_SNAP_PHOTO();
  }
  return hr;
}