Compartilhar via


Como fazer a manutenção da impressora em um aplicativo de dispositivo UWP

Important

Os metadados do dispositivo foram preteridos e serão removidos numa versão futura do Windows. Para obter informações sobre a substituição dessa funcionalidade, consulte Metadados de Contêiner do Pacote de Driver.

No Windows 8.1, os aplicativos de dispositivo UWP podem executar a manutenção da impressora, como alinhar cabeças de impressão e limpar bocais. Este artigo usa a versão C# do exemplo de gerenciamento de trabalho de impressão e manutenção da impressora para demonstrar como a comunicação bidirecional (Bidi) pode ser usada para executar essa manutenção do dispositivo. Para saber mais sobre aplicativos de dispositivo UWP em geral, consulte Conheça os aplicativos de dispositivo UWP.

A versão C# do exemplo de gerenciamento de trabalho de impressão e manutenção da impressora demonstra a manutenção da impressora com o arquivo DeviceMaintenance.xaml.cs no projeto DeviceAppForPrinters2 . To work with Bidi, the sample uses the printer extension library in the PrinterExtensionLibrary project. A biblioteca de extensão da impressora fornece uma maneira conveniente de acessar as interfaces de extensão da impressora do driver de impressão v4. Para obter mais informações, consulte a visão geral da biblioteca de extensão da impressora.

Note

Os exemplos de código mostrados neste artigo baseiam-se na versão C# do exemplo de gerenciamento de trabalho de impressão e manutenção da impressora . Este exemplo também está disponível em JavaScript e C++. Como o C++ pode acessar o COM diretamente, a versão C++ do exemplo não inclui projetos de biblioteca de código. Baixe os exemplos para ver as versões mais recentes do 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. Essas interfaces possibilitam enviar assíncronamente solicitações Bidi para o monitor de porta para que possam ser traduzidas em comandos específicos do dispositivo e do protocolo e, em seguida, enviadas para a impressora. Para obter mais informações, consulte Manutenção do Dispositivo (Driver de Impressora v4).

Tip

Os aplicativos C# e JavaScript não podem funcionar diretamente com APIs COM. Se você estiver escrevendo um aplicativo de dispositivo UWP em C# ou JavaScript, use a biblioteca de extensão da impressora para acessar essas interfaces (conforme mostrado neste artigo).

Prerequisites

Antes de começar:

  1. Verifique se a impressora está instalada usando um driver de impressão v4. Para obter mais informações, consulte Desenvolvendo drivers de impressão v4.

  2. Configure seu computador de desenvolvimento. See Getting started for info about downloading the tools and creating a developer account.

  3. Associe seu aplicativo à loja. Consulte Criar um aplicativo de dispositivo UWP para obter informações sobre isso.

  4. Crie metadados de dispositivo para sua impressora que a associe ao seu aplicativo. Para obter mais informações, consulte Criar metadados do dispositivo.

  5. Crie a interface do usuário para a página principal do aplicativo. Todos os aplicativos de dispositivo UWP podem ser iniciados desde o início, onde são exibidos em tela inteira. Use a experiência De início para realçar seu produto ou serviços de uma maneira que corresponda à identidade visual e aos recursos específicos de seus dispositivos. Não há restrições especiais sobre o tipo de controles de interface do usuário que ele pode usar. Para começar a usar o design da experiência em tela inteira, consulte os princípios de design da Microsoft Store.

  6. If you're writing your app with C# or JavaScript, add the PrinterExtensionLibrary project to your UWP device app solution. Você pode encontrar esse projeto no exemplo de gerenciamento de trabalho de impressão e manutenção da impressora .

Note

Como o C++ pode acessar o COM diretamente, os aplicativos C++ não exigem uma biblioteca separada para trabalhar com o contexto do dispositivo de impressora baseado em COM.

Etapa 1: Preparar solicitação bidi

As interfaces de manutenção do dispositivo exigem que suas solicitações Bidi sejam dados XML na forma de uma cadeia de caracteres. Você pode construir suas solicitações Bidi onde quer que faça sentido em seu aplicativo. Por exemplo, você pode salvar as solicitações bidi como constantes de cadeia de caracteres ou criá-las dinamicamente com base na entrada do usuário. O exemplo de gerenciamento de trabalho de impressão e manutenção da impressora ocorre para construir uma solicitação padrão no OnNavigatedTo método. 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>";

Etapa 2: Localizar impressora

Antes que seu aplicativo possa enviar comandos para a impressora, ele deve primeiro localizar a impressora. Para fazer isso, o exemplo de gerenciamento de trabalho de impressão e manutenção de impressora inclui uma classe nomeada PrinterEnumeration (no arquivo PrinterEnumeration.cs ). Essa classe localiza todas as impressoras associadas ao seu aplicativo por meio de metadados do dispositivo e retorna uma lista de PrinterInfo objetos, que contém os nomes e as IDs do dispositivo para cada impressora.

This example is from the EnumeratePrinters_Click method of the DeviceMaintenance.xaml.cs file. Ele mostra como o exemplo usa a PrinterEnumeration classe para obter uma lista de impressoras associadas.

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.

Etapa 3: Enviar solicitação bidi

Para enviar a solicitação Bidi, as interfaces de manutenção do dispositivo exigem uma cadeia de caracteres Bidi e um retorno de chamada. SendBidiRequest_Click No método, o exemplo primeiro usa um PrinterInfo objeto para criar um objeto de contexto de extensão de impressora chamado context. Em seguida, um PrinterBidiSetRequestCallback objeto é criado e um manipulador de eventos é adicionado para lidar com o evento do retorno de OnBidiResponseReceived chamada. Por fim, o método do contexto de extensão da SendBidiSetRequestAsync impressora é usado para enviar a cadeia de caracteres Bidi e o retorno de chamada.

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

Etapa 4: Receber resposta bidi

Quando a operação "set" bidi é concluída, o objeto de retorno de chamada, do tipo PrinterBidiSetRequestCallback, é invocado. Esse retorno de chamada cuida do tratamento de erros da resposta HRESULT e dispara o OnBidiResponseReceived evento, enviando a resposta Bidi por meio dos parâmetros de 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;
}

Em seguida, a resposta Bidi é enviada para o OnBidiResponseReceived método, em que é Dispatcher usado para exibir os resultados no thread da interface do usuário.

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

Antes de testar seu aplicativo de dispositivo UWP, ele deve estar vinculado à sua impressora usando metadados do dispositivo.

Você precisa de uma cópia do pacote de metadados do dispositivo para sua impressora, para adicionar as informações do aplicativo de dispositivo a ele. Se você não tiver metadados de dispositivo, poderá criá-lo usando o Assistente de Criação de Metadados do Dispositivo , conforme descrito no artigo Criar metadados de dispositivo para seu aplicativo de dispositivo UWP.

Note

Para usar o Assistente de Criação de Metadados do Dispositivo, você deve instalar o Microsoft Visual Studio Professional, o Microsoft Visual Studio Ultimate ou o SDK autônomo para Windows 8.1, antes de concluir as etapas neste artigo. A instalação do Microsoft Visual Studio Express para Windows instala uma versão do SDK que não inclui o assistente.

As etapas a seguir criam seu aplicativo e instalam os metadados do dispositivo.

  1. Habilite a assinatura de teste.

    1. Inicie o Assistente de Criação de Metadados do Dispositivo%ProgramFiles(x86)%\Windows Kits\8.1\bin\x86 clicando duas vezes DeviceMetadataWizard.exe

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

  2. Reinicializar o computador

  3. Crie a solução abrindo o arquivo de solução (.sln). Pressione F7 ou vá para a Solução Build-Build> no menu superior depois que o exemplo for carregado.

  4. Desconecte e desinstale a impressora. Essa etapa é necessária para que o Windows leia os metadados do dispositivo atualizados na próxima vez que o dispositivo for detectado.

  5. Editar e salvar metadados do dispositivo. Para vincular o aplicativo de dispositivo ao seu dispositivo, você deve associar o aplicativo de dispositivo ao seu dispositivo. Se os metadados do dispositivo ainda não forem criados, consulte Criar metadados de dispositivo para seu aplicativo de dispositivo UWP.

    1. Se o Assistente de Criação de Metadados do Dispositivo ainda não estiver aberto, inicie-o de %ProgramFiles(x86)%\Windows Kits\8.1\bin\x86, clicando duas vezes emDeviceMetadataWizard.exe.

    2. Selecione Editar Metadados do Dispositivo. Essa opção permite editar o pacote de metadados do 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. Na página Especificar informações do aplicativo de dispositivo UWP , insira as informações do aplicativo da Microsoft Store na caixa de aplicativo do dispositivo UWP . Selecione Importar arquivo de manifesto do aplicativo UWP para inserir automaticamente o nome do pacote, o nome do Publicador e a ID do aplicativo 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. Na página Revisar o pacote de metadados do dispositivo , verifique se todas as configurações estão corretas e selecione Copiar o pacote de metadados do dispositivo para o repositório de metadados na caixa de seleção do computador local . Then select Save.

  6. Reconecte sua impressora para que o Windows leia os metadados do dispositivo atualizados quando o dispositivo estiver conectado.