Delen via


Printeronderhoud uitvoeren in een UWP-apparaat-app

Important

Metagegevens van apparaten zijn afgeschaft en worden verwijderd in een toekomstige versie van Windows. Zie Containermetagegevens voor stuurprogrammapakketten voor informatie over de vervanging voor deze functionaliteit.

In Windows 8.1 kunnen UWP-apparaat-apps printeronderhoud uitvoeren, zoals het uitlijnen van printkoppen en reinigingsmonden. In dit artikel wordt de C#-versie van het afdruktaakbeheer- en printeronderhoudsvoorbeeld gebruikt om te laten zien hoe bidirectionele communicatie (Bidi) kan worden gebruikt om dergelijk apparaatonderhoud uit te voeren. Zie Meet UWP-apparaat-appsvoor meer informatie over UWP-apparaat-apps in het algemeen.

De C#-versie van het Afdruktaakbeheer en printeronderhoud voorbeeld laat het printeronderhoud zien met het DeviceMaintenance.xaml.cs bestand in het DeviceAppForPrinters2 project. To work with Bidi, the sample uses the printer extension library in the PrinterExtensionLibrary project. De printeruitbreidingsbibliotheek biedt een handige manier om toegang te krijgen tot de printeruitbreidingsinterfaces van het v4-printerstuurprogramma. Voor meer informatie, zie het overzicht van de printeruitbreidingsbibliotheek.

Note

De codevoorbeelden die in dit artikel worden weergegeven, zijn gebaseerd op de C#-versie van het afdruktaakbeheer en het afdrukonderhoudsvoorbeeld . Dit voorbeeld is ook beschikbaar in JavaScript en C++. Omdat C++ rechtstreeks toegang heeft tot COM, bevat de C++-versie van het voorbeeld geen codebibliotheekprojecten. Download de voorbeelden om de nieuwste versies van de code te bekijken.

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. Deze interfaces maken het mogelijk om asynchroon Bidi-aanvragen naar de poortmonitor te verzenden, zodat ze kunnen worden omgezet in apparaat- en protocolspecifieke opdrachten en vervolgens naar de printer worden verzonden. Zie Device Maintenance (v4 Printer Driver)voor meer informatie.

Tip

C# en JavaScript-apps kunnen niet rechtstreeks met COM-API's werken. Als u een C#- of JavaScript UWP-apparaat-app schrijft, gebruikt u de printerextensiebibliotheek voor toegang tot deze interfaces (zoals wordt weergegeven in dit artikel).

Prerequisites

Voordat u aan de slag gaat:

  1. Zorg ervoor dat uw printer is geïnstalleerd met een v4-afdrukstuurprogramma. Zie Ontwikkelen van v4-printerstuurprogramma'svoor meer informatie.

  2. Zorg dat uw ontwikkel-pc is ingesteld. See Getting started for info about downloading the tools and creating a developer account.

  3. Koppel uw app aan de Store. Zie Een UWP-apparaat-app maken voor informatie hierover.

  4. Maak apparaatmetagegevens voor uw printer die deze aan uw app koppelt. Zie Metagegevens van apparaten maken voor meer informatie.

  5. Bouw de gebruikersinterface voor de hoofdpagina van uw app. Alle UWP-apparaat-apps kunnen worden gestart vanaf het startscherm, waar ze op volledig scherm worden weergegeven. Gebruik de Start-ervaring om uw product of services te markeren op een manier die overeenkomt met de specifieke huisstijl en functies van uw apparaten. Er zijn geen speciale beperkingen voor het type UI-besturingselementen dat kan worden gebruikt. Zie de ontwerpprincipes voor Microsoft Storeom aan de slag te gaan met het ontwerp van de volledige schermervaring.

  6. If you're writing your app with C# or JavaScript, add the PrinterExtensionLibrary project to your UWP device app solution. U vindt dit project in het Afdruktaakbeheer en printeronderhoud voorbeeld.

Note

Omdat C++ rechtstreeks toegang heeft tot COM, hebben C++-apps geen afzonderlijke bibliotheek nodig om te werken met de com-printerapparaatcontext.

Stap 1: Bidi-aanvraag voorbereiden

De onderhoudsinterfaces van het apparaat vereisen dat uw Bidi-aanvragen XML-gegevens zijn in de vorm van een tekenreeks. U kunt uw Bidi-aanvragen samenstellen, waar deze ook in uw app zinvol zijn. U kunt de Bidi-aanvragen bijvoorbeeld opslaan als tekenreeksconstanten of ze dynamisch maken op basis van gebruikersinvoer. Het voorbeeld voor beheer van afdrukopdrachten en onderhoud van de printer is bedoeld om een standaardsverzoek te maken met de OnNavigatedTo-methode. 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>";

Stap 2: Printer zoeken

Voordat uw app opdrachten naar de printer kan verzenden, moet deze eerst de printer vinden. Hiervoor bevat het afdruktaakbeheer en printeronderhoud voorbeeld een klasse met de naam PrinterEnumeration (in het bestand PrinterEnumeration.cs). Deze klasse vindt alle printers die zijn gekoppeld aan uw app via metagegevens van het apparaat en retourneert een lijst met PrinterInfo objecten, die de namen en apparaat-id's voor elke printer bevat.

This example is from the EnumeratePrinters_Click method of the DeviceMaintenance.xaml.cs file. Hier ziet u hoe het voorbeeld gebruikmaakt van de PrinterEnumeration-klasse om een lijst met gekoppelde printers op te halen.

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.

Stap 3: Bidi-aanvraag verzenden

Voor het verzenden van de Bidi-aanvraag zijn voor de onderhoudsinterfaces van het apparaat een Bidi-tekenreeks en een callback vereist. In de methode SendBidiRequest_Click wordt in het voorbeeld eerst een PrinterInfo-object gebruikt om een contextobject voor de printerextensie te maken met de naam context. Vervolgens wordt er een PrinterBidiSetRequestCallback-object gemaakt en wordt er een gebeurtenis-handler toegevoegd om de OnBidiResponseReceived gebeurtenis van de callback af te handelen. Ten slotte wordt de SendBidiSetRequestAsync-methode van de printer-extensiecontext gebruikt om de Bidi-tekenreeks en de callback te verzenden.

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

Stap 4: Bidi-antwoord ontvangen

Wanneer de Bidi-bewerking 'set' is voltooid, wordt het callback-object van het type PrinterBidiSetRequestCallbackaangeroepen. Deze callback zorgt voor de foutafhandeling van het HRESULT-antwoord en activeert vervolgens de OnBidiResponseReceived gebeurtenis, waardoor het Bidi-antwoord wordt verzonden via de gebeurtenisparameters.

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

Het Bidi-antwoord wordt vervolgens verzonden naar de methode OnBidiResponseReceived, waarbij de Dispatcher wordt gebruikt om de resultaten op de UI-thread weer te geven.

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

Voordat u uw UWP-apparaat-app kunt testen, moet deze zijn gekoppeld aan uw printer met behulp van apparaatmetagegevens.

U hebt een kopie van het metagegevenspakket van het apparaat voor uw printer nodig om de app-gegevens van het apparaat eraan toe te voegen. Als u geen metagegevens van apparaten hebt, kunt u het maken met behulp van de wizard Apparaatmetagegevens maken , zoals beschreven in het artikel Apparaatmetagegevens maken voor uw UWP-apparaat-app.

Note

Als u de wizard Ontwerpen van apparaatmetagegevens wilt gebruiken, moet u Microsoft Visual Studio Professional, Microsoft Visual Studio Ultimate of de zelfstandige SDK voor Windows 8.1 installeren voordat u de stappen in dit artikel voltooit. Als u Microsoft Visual Studio Express voor Windows installeert, wordt een versie van de SDK geïnstalleerd die de wizard niet bevat.

Met de volgende stappen bouwt u uw app en installeert u de metagegevens van het apparaat.

  1. Testondertekening inschakelen.

    1. Start de wizard Apparaatmetagegevens ontwerpen vanuit %ProgramFiles(x86)%\Windows Kits\8.1\bin\x86 door te dubbelklikken op DeviceMetadataWizard.exe

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

  2. De computer opnieuw opstarten

  3. Bouw de oplossing door het oplossingsbestand (.sln) te openen. Druk op F7 of ga naar Build-Build> Solution in het bovenste menu nadat het voorbeeld is geladen.

  4. Verbreek de verbinding met de printer en verwijder deze. Deze stap is vereist, zodat Windows de bijgewerkte metagegevens van het apparaat leest wanneer het apparaat de volgende keer wordt gedetecteerd.

  5. Metagegevens van apparaten bewerken en opslaan. Om de apparaat-app aan uw toestel te koppelen, moet u de app met uw apparaat verbinden. Als de metagegevens van uw apparaat nog niet zijn gemaakt, raadpleegt u Apparaatmetagegevens maken voor uw UWP-apparaat-app.

    1. Als de wizard Metagegevens van het apparaat nog niet is geopend, start u deze vanuit %ProgramFiles(x86)%\Windows Kits\8.1\bin\x86 door te dubbelklikken op DeviceMetadataWizard.exe.

    2. Selecteer Metagegevens van apparaat bewerken. Met deze optie kunt u het bestaande metagegevenspakket van het apparaat bewerken.

    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. Voer op de pagina UWP-device-app-gegevens opgeven de Microsoft Store-app-gegevens in het UWP-device-app-vak in. Selecteer Het MANIFESTbestand van uw UWP-app importeren om automatisch de pakketnaam, de naam van de uitgever en de UWP-app-id in te voeren.

    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. Op de pagina Beoordeel het metagegevenspakket van het apparaat, controleer of alle instellingen juist zijn en vink het vakje om het metagegevenspakket van het apparaat naar het metagegevensarchief op de lokale computer te kopiëren aan. Then select Save.

  6. Maak opnieuw verbinding met de printer zodat Windows de bijgewerkte metagegevens van het apparaat leest wanneer het apparaat is verbonden.