Compartir a través de


Cómo realizar el mantenimiento de impresoras en una aplicación de dispositivo para UWP

En Windows 8.1, las aplicaciones de dispositivos para UWP pueden realizar el mantenimiento de la impresora, como alinear cabezales de impresión y limpiar inyectores. En este tema se usa la versión de C# del ejemplo Administración de trabajos de impresión y mantenimiento de impresoras para mostrar cómo se puede usar la comunicación bidireccional (Bidi) para realizar este mantenimiento de dispositivos. Para obtener más información sobre las aplicaciones de dispositivos para UWP en general, consulte Conocer las aplicaciones de dispositivos para UWP.

La versión de C# del ejemplo Administración de trabajos de impresión y mantenimiento de impresoras muestra el mantenimiento de la impresora con el archivo DeviceMaintenance.xaml.cs en el proyecto DeviceAppForPrinters2. Para trabajar con bidi, el ejemplo usa la biblioteca de extensiones de impresora del proyecto PrinterExtensionLibrary. La biblioteca de extensiones de impresora proporciona una manera cómoda de acceder a las interfaces de extensión de impresora del controlador de impresión v4. Para obtener más información, consulte Información general sobre la biblioteca de extensiones de impresora.

Nota:

Los ejemplos de código que se muestran en este tema se basan en la versión de C# del ejemplo Administración de trabajos de impresión y mantenimiento de impresoras. Este ejemplo también está disponible en JavaScript y C++. Tenga en cuenta que, dado que C++ puede acceder directamente a COM, la versión de C++ del ejemplo no incluye proyectos de biblioteca de código. Descargue los ejemplos para ver las versiones más recientes del código.

Mantenimiento de impresoras

Windows 8.1 presenta nuevas interfaces de extensión de impresora en el controlador de impresora v4 que puede usar para implementar el mantenimiento del dispositivo: IPrinterBidiSetRequestCallback, IPrinterExtensionAsyncOperation y IPrinterQueue2. Estas interfaces permiten enviar de forma asíncrona solicitudes Bidi al monitor del puerto para que se traduzcan en comandos específicos del dispositivo y del protocolo y, a continuación, se envíen a la impresora. Para obtener más información, consulte Mantenimiento de dispositivos (controlador de impresora v4).

Sugerencia

Las aplicaciones de C# y JavaScript no pueden trabajar directamente con las API COM. Si está escribiendo una aplicación de dispositivo para UWP de C# o JavaScript, use la biblioteca de extensiones de impresora para acceder a estas interfaces (como se muestra en este tema).

Requisitos previos

Antes de comenzar:

  1. Asegúrese de que la impresora esté instalada con un controlador de impresión v4. Para obtener más información, consulte Desarrollo de controladores de impresión v4.

  2. Configure su equipo de desarrollo. Consulte Introducción para obtener información sobre cómo descargar las herramientas y crear una cuenta de desarrollador.

  3. Asocie la aplicación con la tienda. Consulte Creación de una aplicación de dispositivo para UWP para obtener información.

  4. Cree metadatos de dispositivo para la impresora que la asocien con la aplicación. Consulte Creación de metadatos de dispositivo para obtener más información.

  5. Cree la interfaz de usuario para la página principal de la aplicación. Todas las aplicaciones de dispositivos para UWP se pueden iniciar desde Inicio, donde se mostrarán a pantalla completa. Use la experiencia de Inicio para resaltar el producto o los servicios de forma que coincida con la personalización de marca y las características específicas de los dispositivos. No hay restricciones especiales en cuanto al tipo de controles de interfaz de usuario que puede usar. Para empezar a trabajar con el diseño de la experiencia a pantalla completa, consulte los Principios de diseño de Microsoft Store.

  6. Si está escribiendo su aplicación con C# o JavaScript, agregue el proyecto PrinterExtensionLibrary a su solución de aplicación de dispositivos para UWP. Puede encontrar este proyecto en el ejemplo Administración de trabajos de impresión y mantenimiento de impresoras.

Nota:

Dado que C++ puede acceder directamente a COM, las aplicaciones de C++ no requieren una biblioteca independiente para trabajar con el contexto del dispositivo de impresora basado en COM.

Paso 1: Preparar la solicitud bidi

Las interfaces de mantenimiento de dispositivos requieren que las solicitudes bidi sean datos XML en forma de cadena. Puede crear sus solicitudes bidi siempre que tengan sentido en su aplicación. Por ejemplo, podría guardar las solicitudes bidi como constantes de cadena o crearlas dinámicamente en función de la entrada de usuario. El ejemplo Administración de trabajos de impresión y mantenimiento de impresoras pasa a construir una solicitud por defecto en el método OnNavigatedTo. Para obtener más información sobre Bidi, consulte Comunicaciones bidireccionales.

Este ejemplo procede del método OnNavigatedTo del archivo DeviceMaintenance.xaml.cs.

string defaultBidiQuery =
    "<bidi:Set xmlns:bidi=\"http://schemas.microsoft.com/windows/2005/03/printing/bidi\">\r\n" +
    "    <Query schema='\\Printer.Maintenance:CleanHead'>\r\n" +
    "        <BIDI_BOOL>false</BIDI_BOOL>\r\n" +
    "    </Query>\r\n" +
    "</bidi:Set>";

Paso 2: Buscar la impresora

Para que la aplicación pueda enviar comandos a la impresora, primero debe localizar la impresora. Para ello, el ejemplo Administración de trabajos de impresión y mantenimiento de impresoras incluye una clase útil denominada PrinterEnumeration (en el archivo PrinterEnumeration.cs). Esta clase busca todas las impresoras asociadas a la aplicación a través de metadatos del dispositivo y devuelve una lista de objetos PrinterInfo, que contiene los nombres y los identificadores de dispositivo de cada impresora.

Este ejemplo procede del método EnumeratePrinters_Click del archivo DeviceMaintenance.xaml.cs. Muestra cómo el ejemplo usa la clase PrinterEnumeration para obtener una lista de impresoras asociadas.

private async void EnumeratePrinters_Click(object sender, RoutedEventArgs e)
{
    try
    {
        rootPage.NotifyUser("Enumerating printers. Please wait", NotifyType.StatusMessage);

        // Retrieve the running app's package family name, and enumerate associated printers.
        string currentPackageFamilyName = Windows.ApplicationModel.Package.Current.Id.FamilyName;

        // Enumerate associated printers.
        PrinterEnumeration pe = new PrinterEnumeration(currentPackageFamilyName);
        List<PrinterInfo> associatedPrinters = await pe.EnumeratePrintersAsync();

        // Update the data binding source on the combo box that displays the list of printers.
        PrinterComboBox.ItemsSource = associatedPrinters;
        if (associatedPrinters.Count > 0)
        {
            PrinterComboBox.SelectedIndex = 0;
            rootPage.NotifyUser(associatedPrinters.Count + " printers enumerated", NotifyType.StatusMessage);
        }
        else
        {
            rootPage.NotifyUser(DisplayStrings.NoPrintersEnumerated, NotifyType.ErrorMessage);
        }
    }
    catch (Exception exception)
    {
        rootPage.NotifyUser("Caught an exception: " + exception.Message, NotifyType.ErrorMessage);
    }
}

Sugerencia

Para obtener más información sobre las clases PrinterEnumeration y PrinterInfo, consulte el archivo PrinterEnumeration.cs.

Paso 3: Enviar la solicitud bidi

Para enviar la solicitud Bidi, las interfaces de mantenimiento del dispositivo requieren una cadena Bidi y una devolución de llamada. En el método SendBidiRequest_Click, el ejemplo usa primero un objeto PrinterInfo para crear un objeto de contexto de extensión de impresora denominado context. A continuación, se crea un objeto PrinterBidiSetRequestCallback y se agrega un controlador de eventos para controlar el evento OnBidiResponseReceived de la devolución de llamada. Por último, el método SendBidiSetRequestAsync del contexto de la extensión de impresora se usa para enviar la cadena bidi y la devolución de llamada.

Este ejemplo procede del método SendBidiRequest_Click del archivo DeviceMaintenance.xaml.cs.

private void SendBidiRequest_Click(object sender, RoutedEventArgs e)
{
    try
    {
        PrinterInfo queue = (PrinterInfo)PrinterComboBox.SelectedItem;

        // Retrieve a COM IPrinterExtensionContext object, using the static WinRT factory.
        // Then instantiate one "PrinterExtensionContext" object that allows operations on the COM object.
        Object comContext = Windows.Devices.Printers.Extensions.PrintExtensionContext.FromDeviceId(queue.DeviceId);
        PrinterExtensionContext context = new PrinterExtensionContext(comContext);

        // Create an instance of the callback object, and perform an asynchronous 'bidi set' operation.
        PrinterBidiSetRequestCallback callback = new PrinterBidiSetRequestCallback();

        // Add an event handler to the callback object's OnBidiResponseReceived event.
        // The event handler will be invoked once the Bidi response is received.
        callback.OnBidiResponseReceived += OnBidiResponseReceived;

        // Send the Bidi "Set" query asynchronously.
        IPrinterExtensionAsyncOperation operationContext
            = context.Queue.SendBidiSetRequestAsync(BidiQueryInput.Text, callback);

        // Note: The 'operationContext' object can be used to cancel the operation if required.
    }
    catch (Exception exception)
    {
        rootPage.NotifyUser("Caught an exception: " + exception.Message, NotifyType.ErrorMessage);
    }
}

Paso 4: Recibir la respuesta bidi

Cuando se completa la operación "set" de Bidi, se invoca el objeto de devolución de llamada, de tipo PrinterBidiSetRequestCallback. Esta devolución de llamada se encarga del control de errores de la respuesta HRESULT y, a continuación, desencadena el evento OnBidiResponseReceived, enviando la respuesta bidi a través de los parámetros del evento.

En este ejemplo se muestra la definición de clase PrinterBidiSetRequestCallback en el archivo DeviceMaintenance.xaml.cs.

internal class PrinterBidiSetRequestCallback : IPrinterBidiSetRequestCallback
{
    /// <summary>
    /// This method is invoked when the asynchronous Bidi "Set" operation is completed.
    /// </summary>
    public void Completed(string response, int statusHResult)
    {
        string result;

        if (statusHResult == (int)HRESULT.S_OK)
        {
            result = "The response is \r\n" + response;
        }
        else
        {
            result = "The HRESULT received is: 0x" + statusHResult.ToString("X") + "\r\n" +
                     "No Bidi response was received";
        }

        // Invoke the event handlers when the Bidi response is received.
        OnBidiResponseReceived(null, result);
    }

    /// <summary>
    /// This event will be invoked when the Bidi 'set' response is received.
    /// </summary>
    public event EventHandler<string> OnBidiResponseReceived;
}

La respuesta bidi se envía al método OnBidiResponseReceived, donde Dispatcher se usa para mostrar los resultados en el subproceso de la interfaz de usuario.

Este ejemplo procede del método OnBidiResponseReceived del archivo DeviceMaintenance.xaml.cs.

internal async void OnBidiResponseReceived(object sender, string bidiResponse)
{
    await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
    {
        BidiResponseOutput.Text = bidiResponse;
    });
}

Prueba

Para poder probar la aplicación de dispositivo para UWP, debe estar vinculada a la impresora mediante metadatos del dispositivo.

Necesita una copia del paquete de metadatos del dispositivo para la impresora, para agregarle la información de la aplicación del dispositivo. Si no tiene metadatos de dispositivo, puede crearlos mediante el Asistente para creación de metadatos de dispositivo, tal como se describe en el tema Creación de metadatos de dispositivo para la aplicación de dispositivo para UWP.

Nota:

Para usar el Asistente para creación de metadatos de dispositivo, debe instalar Microsoft Visual Studio Professional, Microsoft Visual Studio Ultimate o el SDK independiente para Windows 8.1, antes de completar los pasos de este tema. La instalación de Microsoft Visual Studio Express para Windows instala una versión del SDK que no incluye el asistente.

Los pasos siguientes permiten crear la aplicación e instalar los metadatos del dispositivo.

  1. Habilite la firma de pruebas.

    1. Inicie el Asistente para creación de metadatos de dispositivo desde %ProgramFiles(x86)%\Windows Kits\8.1\bin\x86, haciendo doble clic en DeviceMetadataWizard.exe

    2. En el menú Herramientas, seleccione Habilitar firma de pruebas.

  2. Reinicie el equipo.

  3. Cree la solución abriendo el archivo de solución (.sln). Pulse F7 o vaya a Crear->Crear solución en el menú superior después de cargar el ejemplo.

  4. Desconecte y desinstale la impresora. Este paso es necesario para que Windows lea los metadatos del dispositivo actualizado la próxima vez que se detecte el dispositivo.

  5. Edite y guarde los metadatos del dispositivo. Para vincular la aplicación de dispositivo al dispositivo, debe asociar la aplicación de dispositivo al dispositivo. Nota: si aún no ha creado los metadatos del dispositivo, consulte Creación de metadatos de dispositivo para la aplicación de dispositivo para UWP.

    1. Si el Asistente para creación de metadatos de dispositivo todavía no está abierto, inícielo desde %ProgramFiles(x86)%\Windows Kits\8.1\bin\x86, haciendo doble clic en DeviceMetadataWizard.exe.

    2. Haga clic en Editar metadatos del dispositivo. Esto le permitirá editar el paquete de metadatos del dispositivo existente.

    3. En el cuadro de diálogo Abrir, busque el paquete de metadatos del dispositivo asociado a la aplicación de dispositivo para UWP. (Tiene una extensión de archivo devicemetadata-ms).

    4. En la página Especificar información de la aplicación de dispositivo para UWP, escriba la información de la aplicación de Microsoft Store en el cuadro Aplicación de dispositivo para UWP. Haga clic en Importar archivo de manifiesto de aplicación para UWP para introducir automáticamente el Nombre del paquete, el Nombre del publicador y el Identificador de la aplicación para UWP.

    5. Si la aplicación está registrada para recibir notificaciones de impresora, rellene el cuadro Controladores de notificaciones. En Identificador de evento, escriba el nombre del controlador de eventos de impresión. En Recurso de evento, escriba el nombre del archivo donde reside ese código.

    6. Cuando haya terminado, haga clic en Siguiente hasta llegar a la página Finalizar.

    7. En la página Revisar el paquete de metadatos del dispositivo, asegúrese de que toda la configuración sea correcta y active la casilla Copiar el paquete de metadatos del dispositivo en el almacén de metadatos del equipo local. A continuación, haga clic en Save(Guardar).

  6. Vuelva a conectar la impresora para que Windows lea los metadatos del dispositivo actualizados cuando se conecte el dispositivo.

Mantenimiento de dispositivos (controlador de impresora v4)

Desarrollo de controladores de impresión v4

Comunicaciones bidireccionales

Introducción a las aplicaciones para UWP

Creación de una aplicación de dispositivo para UWP (guía paso a paso)

Creación de metadatos de dispositivo para una aplicación de dispositivo para UWP (guía paso a paso)