Compartir a través de


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

Important

Los metadatos de dispositivo están obsoletos y se eliminarán en una futura versión de Windows. Para obtener información sobre el reemplazo de esta funcionalidad, vea Driver Package Container Metadata.

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 boquillas. En este artículo se usa la versión de C# del ejemplo de administración de trabajos de impresión e mantenimiento de impresoras para demostrar 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, consulta Meet UWP device apps (Conocer aplicaciones de dispositivos para UWP).

La versión de C# del ejemplo de administración de trabajos de impresión e mantenimiento de impresoras muestra el mantenimiento de la impresora con el archivo DeviceMaintenance.xaml.cs en el proyecto DeviceAppForPrinters2 . To work with Bidi, the sample uses the printer extension library in the PrinterExtensionLibrary project. 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 la introducción a la biblioteca de extensiones de impresora.

Note

Los ejemplos de código que se muestran en este artículo se basan en la versión de C# del ejemplo de administración de trabajos de impresión e mantenimiento de impresoras . Este ejemplo también está disponible en JavaScript y C++. 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.

Printer maintenance

Windows 8.1 introduces new printer extension interfaces in the v4 printer driver that you can use for implementing device maintenance: IPrinterBidiSetRequestCallback, IPrinterExtensionAsyncOperation , and IPrinterQueue2. Estas interfaces permiten enviar de forma asincrónica solicitudes Bidi al monitor de puerto para que se puedan traducir 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, consulta Mantenimiento de dispositivos (controlador de impresora v4).

Tip

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

Prerequisites

Antes de comenzar:

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

  2. Configure tu PC de desarrollo. See Getting started for info about downloading the tools and creating a developer account.

  3. Asocie la aplicación a la tienda. Consulta Crear una aplicación de dispositivo para UWP para obtener información sobre eso.

  4. Cree metadatos de dispositivo para la impresora que la asocie a la aplicación. Para obtener más información, consulte Creación de metadatos de dispositivo.

  5. Compile 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 muestran en pantalla completa. Utiliza la experiencia de inicio para resaltar tus productos o servicios de una manera que coincida con la imagen de marca y las características específicas de tus dispositivos. No hay restricciones especiales en el tipo de controles de interfaz de usuario que puede usar. Para empezar a trabajar con el diseño de la experiencia de pantalla completa, consulta los principios de diseño de Microsoft Store.

  6. If you're writing your app with C# or JavaScript, add the PrinterExtensionLibrary project to your UWP device app solution. Puede encontrar este proyecto en el ejemplo de administración de trabajos de impresión e mantenimiento de impresoras .

Note

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. Puedes construir tus solicitudes Bidi siempre que tengan sentido en tu aplicación. Por ejemplo, podría guardar las solicitudes bidi como constantes de cadena o crearlas dinámicamente en función de la entrada del usuario. El ejemplo de administración de trabajos de impresión y mantenimiento de impresoras sirve para construir una solicitud predeterminada en el método OnNavigatedTo. For more info about Bidi, see Bidirectional Communications.

This example is from the OnNavigatedTo method of the DeviceMaintenance.xaml.cs file.

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 impresora

Para que la aplicación pueda enviar comandos a la impresora, primero debe localizar la impresora. Para ello, el ejemplo de administración de trabajos de impresión e mantenimiento de impresoras incluye una clase 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 PrinterInfo objetos, que contiene los nombres y los identificadores de dispositivo de cada impresora.

This example is from the EnumeratePrinters_Click method of the DeviceMaintenance.xaml.cs file. Muestra cómo el ejemplo usa la PrinterEnumeration clase 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);
    }
}

Tip

For more info about the PrinterEnumeration and PrinterInfo classes, see the PrinterEnumeration.cs file.

Paso 3: Enviar solicitud Bidi

Para enviar la solicitud Bidi, las interfaces de mantenimiento del dispositivo requieren una cadena Bidi y un callback. En el SendBidiRequest_Click método , el ejemplo usa primero un PrinterInfo objeto para crear un objeto de contexto de extensión de impresora denominado context. A continuación, se crea un PrinterBidiSetRequestCallback objeto y se agrega un controlador de eventos para manejar el evento de devolución de llamada OnBidiResponseReceived. 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.

This example is from the SendBidiRequest_Click method of the DeviceMaintenance.xaml.cs file.

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);

        // 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.

This example shows the PrinterBidiSetRequestCallback class definition in the DeviceMaintenance.xaml.cs file.

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.

This example is from the OnBidiResponseReceived method of the DeviceMaintenance.xaml.cs file.

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

Testing

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 compilarlos mediante el Asistente para creación de metadatos de dispositivo, tal como se describe en el artículo Creación de metadatos de dispositivo para la aplicación de dispositivo para UWP.

Note

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 artículo. La instalación de Microsoft Visual Studio Express para Windows instala una versión del SDK que no incluye el asistente.

Los pasos siguientes compilan la aplicación e instalan los metadatos del dispositivo.

  1. Habilite la firma de prueba.

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

    2. From the Tools menu, select Enable Test Signing.

  2. Reiniciar el equipo

  3. Compile la solución abriendo el archivo de solución (.sln). Presione F7 o vaya a Build-Build> Solution 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 conectar la aplicación al dispositivo, debe asociarla con su equipo. Si aún no se han creado los metadatos del dispositivo, consulta Crear metadatos de dispositivo para tu aplicación de dispositivo para UWP.

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

    2. Seleccione Editar metadatos del dispositivo. Esta opción le permite editar el paquete de metadatos del dispositivo existente.

    3. In the Open dialog box, locate the device metadata package associated with your UWP device app. (It has a devicemetadata-ms file extension.)

    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 . Seleccione Importar archivo de manifiesto de aplicación para UWP para escribir automáticamente el nombre del paquete, el nombre del publicador y el identificador de la aplicación para UWP.

    5. If your app is registering for printer notifications, fill out the Notification handlers box. In Event ID, enter the name of the print event handler. In Event Asset, enter the name of the file where that code resides.

    6. When you're done, select Next until you get to the Finish page.

    7. En la página Revisar el paquete de metadatos del dispositivo , asegúrese de que toda la configuración es correcta y active la casilla Copiar el paquete de metadatos del dispositivo en el almacén de metadatos del equipo local . Then select Save.

  6. Vuelva a conectar la impresora para que Windows lea los metadatos del dispositivo actualizados cuando el dispositivo esté conectado.