Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Important
Os metadados do dispositivo foram preteridos e serão removidos em uma versão futura do Windows. Para obter informações sobre a substituição dessa funcionalidade, consulte Metadados do 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 bicos injetores. Este artigo usa a versão em C# do Exemplo de gerenciamento de tarefas de impressão e manutenção de impressora para demonstrar como a comunicação bidirecional (Bidi) pode ser usada para executar essa manutenção de dispositivo. Para saber mais sobre os aplicativos de dispositivo UWP em geral, consulte Meet UWP device apps.
A versão em C# do exemplo de gestão de trabalhos de impressão e manutenção de impressoras demonstra a manutenção da impressora utilizando o ficheiro 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ões de impressora fornece uma maneira conveniente de acessar as interfaces de extensão de impressora do driver de impressão v4. Para obter mais informações, consulte a visão geral da biblioteca de extensões de impressora .
Note
Os exemplos de código mostrados neste artigo são baseados na versão C# do Exemplo de gerenciamento de tarefas de impressão e manutenção de impressora . Este exemplo também está disponível em JavaScript e C++. Como o C++ pode acessar COM diretamente, a versão C++ do exemplo não inclui projetos de biblioteca de código. Faça o download dos 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 o envio assíncrono de 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 trabalhar diretamente com APIs COM. Se você estiver escrevendo um aplicativo de dispositivo UWP C# ou JavaScript, use a biblioteca de extensões de impressora para acessar essas interfaces (conforme mostrado neste artigo).
Prerequisites
Antes de começar:
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.
Configure o seu PC de desenvolvimento. See Getting started for info about downloading the tools and creating a developer account.
Associe seu aplicativo à loja. Consulte Criar um aplicativo de dispositivo UWP para obter informações sobre isso.
Crie metadados de dispositivo para sua impressora que os associem ao seu aplicativo. Para obter mais informações, consulte Criar metadados de dispositivo.
Crie a interface do usuário para a página principal do seu aplicativo. Todos os aplicativos de dispositivo UWP podem ser iniciados na tela inicial, onde são exibidos em tela cheia. Utilize a experiência Iniciar para destacar o seu produto ou serviços de uma forma que corresponda à marca e às funcionalidades específicas dos 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 com o design da experiência de tela inteira, consulte os princípios de design da Microsoft Store .
If you're writing your app with C# or JavaScript, add the PrinterExtensionLibrary project to your UWP device app solution. Você pode encontrar este projeto no Exemplo de gerenciamento de tarefas de impressão e manutenção de impressoras.
Note
Como o C++ pode acessar COM diretamente, os aplicativos C++ não exigem uma biblioteca separada para trabalhar com o contexto do dispositivo de impressora baseado em COM.
Passo 1: Preparar o pedido Bidi
As interfaces de manutenção de dispositivo exigem que suas solicitações Bidi sejam dados XML na forma de uma cadeia de caracteres. Você pode construir suas solicitações Bidi sempre que fizer 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 de gerenciamento de tarefas de impressão e manutenção de impressora do é utilizado para construir uma solicitação padrão no 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>";
Passo 2: Encontrar impressora
Antes que seu aplicativo possa enviar comandos para a impressora, ele deve primeiro localizar a impressora. Para fazer isso, o exemplo de de gerenciamento de tarefas de impressão e manutenção de impressora do inclui uma classe chamada PrinterEnumeration (no arquivo PrinterEnumeration.cs). Essa classe localiza todas as impressoras associadas ao seu aplicativo por meio de metadados de dispositivo e retorna uma lista de objetos PrinterInfo, que contém os nomes e IDs de 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 classe PrinterEnumeration 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.
Passo 3: Enviar pedido Bidi
Para enviar a solicitação Bidi, as interfaces de manutenção do dispositivo requerem uma string Bidi e um callback. No método SendBidiRequest_Click, o exemplo primeiro usa um objeto PrinterInfo para criar um objeto de contexto de extensão de impressora chamado context. Em seguida, um objeto PrinterBidiSetRequestCallback é criado e um manipulador de eventos é adicionado para manipular o evento OnBidiResponseReceived do retorno de chamada. Finalmente, o método SendBidiSetRequestAsync do contexto da extensão da 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);
}
}
Passo 4: Receba a resposta Bidi
Quando a operação "set" Bidi é concluída, o objeto de retorno de chamada, do tipo PrinterBidiSetRequestCallback, é invocado. Este callback lida com o tratamento de erros da resposta HRESULT e, em seguida, aciona o evento OnBidiResponseReceived, enviando a resposta Bidi por meio dos parâmetros do 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;
}
A resposta Bidi é então enviada para o método OnBidiResponseReceived, onde o 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 ser vinculado à 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 do dispositivo a ela. Se você não tiver metadados de dispositivo, poderá criá-los usando o Device Metadata Authoring Wizard , conforme descrito no artigo Criar metadados de dispositivo para seu aplicativo de dispositivo UWP.
Note
Para usar o Device Metadata Authoring Wizard, você deve instalar o Microsoft Visual Studio Professional, 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.
Habilite a assinatura de teste.
Inicie o Assistente para Criação de Metadados de Dispositivo a partir do %ProgramFiles(x86)%\Windows Kits\8.1\bin\x86, clicando duas vezes em DeviceMetadataWizard.exe
From the Tools menu, select Enable Test Signing.
Reinicie o computador
Crie a solução abrindo o arquivo de solução (.sln). Pressione F7 ou vá para Build-Build> Solution no menu superior depois que o exemplo for carregado.
Desconecte e desinstale a impressora. Esta etapa é necessária para que o Windows leia os metadados atualizados do dispositivo na próxima vez que o dispositivo for detetado.
Edite e salve metadados do dispositivo. Para vincular o aplicativo de dispositivo ao seu dispositivo, você deve associá-lo ao seu dispositivo. Se os metadados do dispositivo ainda não tiverem sido criados, consulte Criar metadados de dispositivo para o aplicativo de dispositivo UWP.
Se o Device Metadata Authoring Wizard ainda não estiver aberto, inicie-o a partir do %ProgramFiles(x86)%\Windows Kits\8.1\bin\x86, clicando duas vezes em DeviceMetadataWizard.exe.
Selecione Editar metadados do dispositivo. Esta opção permite-lhe editar o pacote de metadados do dispositivo existente.
In the Open dialog box, locate the device metadata package associated with your UWP device app. (It has a devicemetadata-ms file extension.)
Na página Especificar informações do aplicativo de dispositivo UWP, insira as informações do aplicativo da Microsoft Store na caixa aplicativo de dispositivo UWP. Selecione Importar arquivo de manifesto do aplicativo UWP para inserir automaticamente o Nome do pacote, o nome do editor e o ID do aplicativo UWP.
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.
When you're done, select Next until you get to the Finish page.
Na página Revisar o pacote de metadados do dispositivo, verifique se todas as configurações estão corretas, e marque a caixa de seleção Copiar o pacote de metadados do dispositivo para o armazenamento de metadados no computador local. Then select Save.
Reconecte a impressora para que o Windows leia os metadados atualizados do dispositivo quando o dispositivo estiver conectado.
Related articles
- Manutenção de dispositivos (driver de impressora v4)
- Desenvolvimento de drivers de impressão v4
- Bidirectional Communications
- Introdução aos aplicativos UWP
- Criar um aplicativo de dispositivo UWP (guia passo a passo)
- Criar metadados de dispositivo para um aplicativo de dispositivo UWP (guia passo a passo)