Freigeben über


Druckerwartung in einer UWP-Geräte-App

In Windows 8.1 können UWP-Geräte-Apps Drucker Standard Tenance ausführen, z. B. das Ausrichten von Druckköpfen und sauber Düsen. In diesem Thema wird die C#-Version der Druckauftragsverwaltung und des Druckers Standard Tenance-Beispiel verwendet, um zu veranschaulichen, wie bidirektionale Kommunikation (Bidi) zum Ausführen dieses Geräts Standard Tenance verwendet werden kann. Weitere Informationen zu UWP-Geräte-Apps im Allgemeinen finden Sie unter UWP-Geräte-Apps kennenlernen.

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. Um mit Bidi zu arbeiten, verwendet das Beispiel die Druckererweiterungsbibliothek im PrinterExtensionLibrary-Projekt . Die Druckererweiterungsbibliothek bietet eine bequeme Möglichkeit, auf die Druckererweiterungsschnittstellen des v4-Drucktreibers zuzugreifen. Weitere Informationen finden Sie in der Übersicht über die Druckererweiterungsbibliothek.

Hinweis

Die in diesem Thema gezeigten Codebeispiele basieren auf der C#-Version des Beispiels 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.

Druckerwartung

Windows 8.1 führt im v4-Druckertreiber neue Druckererweiterungsschnittstellen ein, die Sie zur Implementierung der Gerätewartung verwenden können: IPrinterBidiSetRequestCallback, IPrinterExtensionAsyncOperation und IPrinterQueue2. Diese Schnittstellen ermöglichen es, Bidi-Anfragen asynchron an den Portmonitor zu senden, damit diese 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).

Tipp

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 Thema gezeigt).

Voraussetzungen

Bevor Sie beginnen:

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

  2. Richten Sie Ihren Entwicklungs-PC ein. Informationen zum Herunterladen der Tools und zum Erstellen eines Entwicklerkontos finden Sie unter Erste Schritte.

  3. Verknüpfen Sie Ihre App mit dem Store. Weitere 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 hierzu finden Sie in Erstellen von Gerätemetadaten .

  5. Erstellen Sie die Benutzeroberfläche für die Standard Seite 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. Wenn Sie Ihre App mit C# oder JavaScript schreiben, fügen Sie der UWP-Geräte-App-Lösung das PrinterExtensionLibrary-Projekt hinzu. Dieses Projekt finden Sie im Druckauftragsverwaltungs- und Drucker-Standard-Beispiel.

Hinweis

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

Das Gerät Standard-Schnittstellen erfordert, 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. Weitere Informationen zu Bidi finden Sie unter Bidirectional Communications.

Dieses Beispiel stammt aus der OnNavigatedTo-Methode der Datei DeviceMaintenance.xaml.cs .

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 Drucker-Standard Tenancebeispiel eine Klasse namens PrinterEnumeration (in der PrinterEnumeration.cs Datei). 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.

Dieses Beispiel stammt aus der EnumeratePrinters_Click-Methode der Datei DeviceMaintenance.xaml.cs . 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);
    }
}

Tipp

Weitere Informationen zu den PrinterEnumeration und PrinterInfo Klassen finden Sie in der PrinterEnumeration.cs Datei.

Schritt 3: Senden einer Bidi-Anforderung

Zum Senden der Bidi-Anforderung benötigen das Gerät Standard Tenance-Schnittstellen 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.

Dieses Beispiel stammt aus der SendBidiRequest_Click-Methode der Datei DeviceMaintenance.xaml.cs .

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

        // Note: 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-Vorgang „set“ abgeschlossen ist, wird das Callback-Objekt vom Typ PrinterBidiSetRequestCallbackaufgerufen. Dieser Callback übernimmt die Fehlerbehandlung aus der HRESULT-Antwort und löst dann das OnBidiResponseReceived-Ereignis aus und sendet die Bidi-Antwort über die Ereignisparameter.

Dieses Beispiel zeigt die PrinterBidiSetRequestCallback-Klassendefinition in der DeviceMaintenance.xaml.cs-Datei .

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 OnBidiResponseReceived-Methode gesendet, in der die Dispatcher-Ergebnisse im UI-Thread angezeigt werden.

Dieses Beispiel stammt aus der OnBidiResponseReceived-Methode der Datei DeviceMaintenance.xaml.cs .

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

Testen

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 keine Gerätemetadaten haben, können Sie diese mit dem Assistenten zum Erstellen von Gerätemetadaten erstellen, wie im Thema Gerätemetadaten für Ihre UWP-Geräte-App erstellen beschrieben.

Hinweis

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 Thema 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ätedaten aus %ProgramFiles(x86)%\Windows Kits\8.1\bin\x86, indem Sie auf DeviceMetadataWizard.exe doppelklicken.

    2. Wählen Sie im Menü "Extras " die Option "Testsignatur aktivieren" aus.

  2. Starten Sie den Computer neu.

  3. Erstellen Sie die Lösung, indem Sie die Lösungsdatei (.sln) öffnen. Drücken Sie F7 oder gehen Sie im oberen Menü zu Build->Build Solution, nachdem das Beispiel geladen wurde.

  4. Trennen Sie den Drucker, und deinstallieren Sie den Drucker. 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. Hinweis: Wenn Sie Ihre Gerätemetadaten noch nicht erstellt haben, lesen Sie Gerätemetadaten für Ihre UWP-Geräte-App erstellen.

    1. Wenn der Device Metadata Authoring Wizard noch nicht geöffnet ist, starten Sie ihn unter %ProgramFiles(x86)%\Windows Kits\8.1\bin\x86, indem Sie auf DeviceMetadataWizard.exe doppelklicken.

    2. Klicken Sie auf Gerätemetadaten bearbeiten. Dadurch können Sie Ihr vorhandenes Gerätemetadatenpaket bearbeiten.

    3. Suchen Sie im Dialogfeld Öffnen das Gerätemetadatenpaket, das Ihrer UWP-Geräte-App zugeordnet ist. (Es verfügt über die Dateierweiterung devicemetadata-ms.)

    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. Klicken Sie auf UWP-App-Manifestdatei importieren, um automatisch den Paketnamen, Herausgebernamen und UWP app ID einzugeben.

    5. Wenn Ihre App für Druckerbenachrichtigungen registriert ist, füllen Sie das Benachrichtigungshandlerfeld aus. Geben Sie in der Ereignis-ID den Namen des Druckereignishandlers ein. Geben Sie in "Event Asset" den Namen der Datei ein, in der sich dieser Code befindet.

    6. Wenn Sie fertig sind, klicken Sie auf Weiter , bis Sie zur Seite Fertig stellen gelangen.

    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". Klicken Sie anschließend auf Speichern.

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

Gerätewartung (v4 Druckertreiber)

Entwickeln von v4-Drucktreibern

Bidirektionale Kommunikationen

Erste Schritte mit UWP-Apps

Erstellen einer UWP-Geräte-App (schrittweise Anleitung)

Erstellen von Gerätemetadaten für eine UWP-Geräte-App (schrittweise Anleitung)