Freigeben über


So führen Sie eine Druckerwartung in einer UWP-Geräte-App durch

Important

Geräte-Metadaten sind veraltet und werden in einer zukünftigen Version von Windows entfernt. Informationen zum Ersatz dieser Funktionalität finden Sie unter Treiberpaketcontainermetadaten.

In Windows 8.1 können UWP-Geräte-Apps Druckerwartung durchführen, z. B. das Ausrichten der Druckköpfe und das Reinigen der Düsen. In diesem Artikel wird die C#-Version der Druckauftragsverwaltung und druckerwartung verwendet, um zu veranschaulichen, wie bidirektionale Kommunikation (Bidi) verwendet werden kann, um eine solche Gerätewartung durchzuführen. Weitere Informationen zu UWP-Geräte-Apps im Allgemeinen finden Sie unter "Treffen von UWP-Geräte-Apps".

Die C#-Version der Druckauftragsverwaltung und des Druckers Standard Tenance-Beispiel veranschaulicht die Standard stellung des Druckers mit der Datei DeviceMaintenance.xaml.cs im DeviceAppForPrinters2-Projekt. To work with Bidi, the sample uses the printer extension library in the PrinterExtensionLibrary project. Die Druckererweiterungsbibliothek bietet eine bequeme Möglichkeit, auf die Druckererweiterungsschnittstellen des v4-Drucktreibers zuzugreifen. Weitere Informationen finden Sie in der Übersicht über die Druckererweiterungsbibliothek.

Note

Die in diesem Artikel gezeigten Codebeispiele basieren auf der C#-Version der Druckauftragsverwaltung und druckerwartung . Dieses Beispiel ist auch in JavaScript und C++ verfügbar. Da C++ direkt auf COM zugreifen kann, enthält die C++-Version des Beispiels keine Codebibliotheksprojekte. Laden Sie die Beispiele herunter, um die neuesten Versionen des Codes anzuzeigen.

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. Diese Schnittstellen ermöglichen es, Bidi-Anforderungen asynchron an den Portmonitor zu senden, damit sie in geräte- und protokollspezifische Befehle übersetzt und dann an den Drucker gesendet werden können. Weitere Informationen finden Sie unter Gerätewartung (v4-Druckertreiber).

Tip

C#- und JavaScript-Apps können nicht direkt mit COM-APIs arbeiten. Wenn Sie eine C#- oder JavaScript-UWP-Geräte-App schreiben, verwenden Sie die Druckererweiterungsbibliothek, um auf diese Schnittstellen zuzugreifen (wie in diesem Artikel gezeigt).

Prerequisites

Bevor Sie beginnen:

  1. Stellen Sie sicher, dass Ihr Drucker mit einem v4-Drucktreiber installiert ist. Weitere Informationen finden Sie unter Entwickeln von v4-Drucktreibern.

  2. Richten Sie Ihren Entwicklungs-PC ein. See Getting started for info about downloading the tools and creating a developer account.

  3. Ordnen Sie Ihre App dem Store zu. Informationen hierzu finden Sie unter Erstellen einer UWP-Geräte-App .

  4. Erstellen Sie Gerätemetadaten für Ihren Drucker, der sie Ihrer App zuordnet. Weitere Informationen finden Sie unter Erstellen von Gerätemetadaten.

  5. Erstellen Sie die Benutzeroberfläche für die Hauptseite Ihrer App. Alle UWP-Geräte-Apps können von "Start" gestartet werden, wo sie im Vollbildmodus angezeigt werden. Verwenden Sie die Startoberfläche, um Ihr Produkt oder Ihre Dienste auf eine Weise hervorzuheben, die den spezifischen Branding- und Features Ihrer Geräte entspricht. Es gibt keine besonderen Einschränkungen für den Typ der UI-Steuerelemente, die sie verwenden können. Informationen zu den ersten Schritten mit dem Design der Vollbildoberfläche finden Sie in den Microsoft Store-Designprinzipien.

  6. If you're writing your app with C# or JavaScript, add the PrinterExtensionLibrary project to your UWP device app solution. Dieses Projekt finden Sie im Beispiel für Druckauftragsverwaltung und Druckerwartung.

Note

Da C++ direkt auf COM zugreifen kann, benötigen C++-Apps keine separate Bibliothek, um mit dem COM-basierten Druckergerätekontext zu arbeiten.

Schritt 1: Vorbereiten der Bidi-Anforderung

Die Gerätewartungsschnittstellen erfordern, dass Ihre Bidi-Anforderungen XML-Daten in Form einer Zeichenfolge sind. Sie können Ihre Bidi-Anforderungen überall erstellen, wo es in Ihrer App sinnvoll ist. Beispielsweise könnten Sie die Bidi-Anforderungen als Zeichenfolgenkonstanten speichern oder dynamisch basierend auf benutzereingaben erstellen. Das Druckauftragsverwaltungs- und Drucker Standard Anforderungsbeispiel erfolgt beim Erstellen einer Standardanforderung in der 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>";

Schritt 2: Suchen des Druckers

Bevor Ihre App Befehle an den Drucker senden kann, muss sie zuerst den Drucker suchen. Dazu enthält das Druckauftragsverwaltungs- und Druckerwartungsbeispiel eine Klasse namens PrinterEnumeration (in der datei PrinterEnumeration.cs ). Diese Klasse findet alle Drucker, die Ihrer App über Gerätemetadaten zugeordnet sind, und gibt eine Liste von PrinterInfo Objekten zurück, die die Namen und Geräte-IDs für jeden Drucker enthält.

This example is from the EnumeratePrinters_Click method of the DeviceMaintenance.xaml.cs file. Es zeigt, wie das Beispiel die PrinterEnumeration Klasse verwendet, um eine Liste der zugeordneten Drucker abzurufen.

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.

Schritt 3: Senden einer Bidi-Anforderung

Zum Senden der Bidi-Anforderung benötigen die Gerätewartungsschnittstellen eine Bidi-Zeichenfolge und einen Rückruf. In der SendBidiRequest_Click Methode verwendet das Beispiel zunächst ein PrinterInfo Objekt zum Erstellen eines Druckererweiterungskontextobjekts mit dem Namen context. Anschließend wird ein PrinterBidiSetRequestCallback Objekt erstellt, und ein Ereignishandler wird hinzugefügt, um das Ereignis des Rückrufs OnBidiResponseReceived zu behandeln. Schließlich wird die Methode des Druckererweiterungskontexts SendBidiSetRequestAsync verwendet, um die Bidi-Zeichenfolge und den Rückruf zu senden.

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

Schritt 4: Empfangen einer Bidi-Antwort

Wenn der Bidi-"Set"-Vorgang abgeschlossen ist, wird das Rückrufobjekt vom Typ PrinterBidiSetRequestCallback aufgerufen. Dieser Rückruf übernimmt die Fehlerbehandlung aus der HRESULT-Antwort und löst dann das OnBidiResponseReceived Ereignis aus und sendet die Bidi-Antwort über die Ereignisparameter.

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

Die Bidi-Antwort wird dann an die Methode OnBidiResponseReceived gesendet, in der Dispatcher verwendet wird, um die Ergebnisse im UI-Thread anzuzeigen.

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

Bevor Sie Ihre UWP-Geräte-App testen können, muss sie mithilfe von Gerätemetadaten mit Ihrem Drucker verknüpft werden.

Sie benötigen eine Kopie des Gerätemetadatenpakets für Ihren Drucker, um die Geräte-App-Informationen hinzuzufügen. Wenn Sie nicht über Gerätemetadaten verfügen, können Sie sie mit dem Assistenten für die Erstellung von Gerätemetadaten erstellen, wie im Artikel "Erstellen von Gerätemetadaten für Ihre UWP-Geräte-App" beschrieben.

Note

Um den Assistenten zum Erstellen von Gerätemetadaten zu verwenden, müssen Sie Microsoft Visual Studio Professional, Microsoft Visual Studio Ultimate oder das eigenständige SDK für Windows 8.1 installieren, bevor Sie die Schritte in diesem Artikel ausführen. Beim Installieren von Microsoft Visual Studio Express für Windows wird eine Version des SDK installiert, die den Assistenten nicht enthält.

Die folgenden Schritte erstellen Ihre App und installieren die Gerätemetadaten.

  1. Aktivieren Sie die Testsignatur.

    1. Starten Sie den Assistenten für die Erstellung von Gerätemetadaten aus %ProgramFiles(x86)%\Windows Kits\8.1\bin\x86, indem Sie auf DeviceMetadataWizard.exe doppelklicken.

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

  2. Neustarten des Computers

  3. Erstellen Sie die Lösung, indem Sie die Lösungsdatei (.sln) öffnen. Drücken Sie F7, oder wechseln Sie im oberen Menü nach dem Laden des Beispiels zur Buildlösung>.

  4. Trennen Sie den Drucker und deinstallieren Sie ihn. Dieser Schritt ist erforderlich, damit Windows die aktualisierten Gerätemetadaten beim nächsten Erkennen des Geräts liest.

  5. Bearbeiten und Speichern von Gerätemetadaten Um die Geräte-App mit Ihrem Gerät zu verknüpfen, müssen Sie die Geräte-App Ihrem Gerät zuordnen. Wenn Ihre Gerätemetadaten noch nicht erstellt wurden, lesen Sie "Erstellen von Gerätemetadaten für Ihre UWP-Geräte-App".

    1. Wenn der Assistent für die Erstellung von Gerätemetadaten noch nicht geöffnet ist, starten Sie ihn von %ProgramFiles(x86)%\Windows Kits\8.1\bin\x86, indem Sie auf DeviceMetadataWizard.exedoppelklicken.

    2. Wählen Sie "Gerätemetadaten bearbeiten" aus. Mit dieser Option können Sie Ihr vorhandenes Gerätemetadatenpaket bearbeiten.

    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. Geben Sie auf der Seite " Informationen zur UWP-Geräte-App angeben " die Informationen zur Microsoft Store-App in das Feld "UWP-Geräte-App " ein. Wählen Sie "UWP-App-Manifestdatei importieren " aus, um automatisch den Paketnamen, den Herausgebernamen und die UWP-App-ID einzugeben.

    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. Vergewissern Sie sich auf der Seite " Überprüfen des Gerätemetadatenpakets ", dass alle Einstellungen korrekt sind, und aktivieren Sie das Kontrollkästchen "Gerätemetadatenpaket in den Metadatenspeicher auf dem lokalen Computer kopieren ". Then select Save.

  6. Verbinden Sie den Drucker erneut, damit Windows die aktualisierten Gerätemetadaten liest, wenn das Gerät verbunden ist.