Freigeben über


Drucker-Erweiterungen

Wichtig

Die moderne Druckplattform ist das bevorzugte Mittel von Windows, um mit Druckern zu kommunizieren. Wir empfehlen die Verwendung des Microsoft IPP-Treibers für die Posteingangsklasse zusammen mit Print Support Apps (PSA), um das Druckverhalten in Windows 10 und 11 für die Entwicklung von Druckergeräten anzupassen.

Weitere Informationen finden Sie unter Moderne Druckplattform und im Entwurfsleitfaden für die Druckunterstützungs-App.

Drucker-Erweiterungsanwendungen unterstützen Druckeinstellungen und Druckerbenachrichtigungen, wenn Benutzer vorhandene Anwendungen auf dem Windows-Desktop ausführen.

Drucker-Erweiterungen können in jeder COM-fähigen Sprache erstellt werden, sind aber für die Erstellung mit Microsoft .NET Framework 4 optimiert. Druckererweiterungen können mit einem Druckertreiberpaket verteilt werden, wenn sie XCopy-fähig sind und keine Abhängigkeiten von externen Laufzeiten haben, die nicht zum Betriebssystem gehören, z. B. .NET. Wenn die Drucker-Erweiterungsanwendung diese Kriterien nicht erfüllt, kann sie in einem setup.exe- oder MSI-Paket verteilt und in der Device Stage-Erfahrung des Druckers mit Hilfe der im v4-Manifest angegebenen PrinterExtensionUrl-Direktive beworben werden. Wenn eine Drucker-Erweiterungsanwendung über ein MSI-Paket verteilt wird, haben Sie die Möglichkeit, den Druckertreiber zum Paket hinzuzufügen oder ihn wegzulassen und den Treiber separat zu verteilen. Die PrinterExtensionUrl wird in den Druckereinstellungen angezeigt.

IT-Administratoren haben einige Möglichkeiten, die Verteilung von Drucker-Erweiterungen zu verwalten. Wenn die Anwendung in einer setup.exe oder MSI verpackt ist, können IT-Administratoren Standard-Softwareverteilungs-Tools wie Microsoft Endpoint Configuration Manager verwenden oder die Anwendungen in ihr Standard-Betriebssystem-Image aufnehmen. IT-Administratoren können auch die im v4-Manifest angegebene PrinterExtensionUrl außer Kraft setzen, wenn sie HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Print\Printers\<Druckwarteschlangenname>\PrinterDriverData\PrinterExtensionUrl bearbeiten.

Und wenn sich ein Unternehmen dafür entscheidet, Druckererweiterungen ganz zu blockieren, kann dies über eine Gruppenrichtlinie namens „Computerkonfiguration\Verwaltungsvorlagen\Drucker\Erlaube v4-Druckertreibern nicht, Druckererweiterungsanwendungen anzuzeigen“ geschehen.

Erstellen einer Drucker-Erweiterung

Wenn Sie eine Druckerweiterung entwickeln, müssen Sie sechs Hauptbereiche beachten. Diese Schwerpunktbereiche sind in der folgenden Liste aufgeführt.

  • Registrierung

  • Ereignisse aktivieren

  • OnDriverEvent Handler

  • Druckeinstellungen

  • Drucker-Benachrichtigungen

  • Verwalten von Druckern

Registrierung

Druckererweiterungen werden beim Drucksystem registriert, indem Sie eine Reihe von Registrierungsschlüsseln angeben oder indem Sie die Anwendungsinformationen im Abschnitt PrinterExtensions der v4-Manifestdatei angeben.

Es gibt festgelegte GUIDs, die jeden der verschiedenen Einstiegspunkte für Drucker-Erweiterungen unterstützen. Sie müssen diese GUIDs nicht in der v4-Manifestdatei verwenden, aber Sie müssen die GUID-Werte kennen, um das Registrierungsformat für die v4-Treiberinstallation zu verwenden. Die folgende Tabelle zeigt die GUID-Werte für die beiden Einstiegspunkte.

Eingangspunkt GUID
Druckeinstellungen {EC8F261F-267C-469F-B5D6-3933023C29CC}
Drucker-Benachrichtigungen {23BB1328-63DE-4293-915B-A6A23D929ACB}

Druckererweiterungen, die außerhalb des Druckertreibers installiert werden, müssen in der Registrierung registriert werden. Dadurch wird sichergestellt, dass Drucker-Erweiterungen unabhängig vom Status des Spoolers oder des v4-Konfigurationsmoduls auf dem Client-Rechner installiert werden können.

Sobald der PrintNotify-Dienst startet, sucht er nach Registrierungsschlüsseln unter dem Pfad [OfflineRoot] und verarbeitet alle ausstehenden Registrierungen oder Aufhebungen von Registrierungen. Sobald alle ausstehenden Registrierungen oder Abmeldungen abgeschlossen sind, werden die Registrierungsschlüssel in Echtzeit gelöscht. Wenn Sie ein Skript oder einen iterativen Prozess zum Platzieren von Registrierungsschlüsseln verwenden, müssen Sie den Schlüssel \[PrinterExtensionID] möglicherweise jedes Mal neu erstellen, wenn Sie einen Schlüssel \[PrinterDriverId] angeben. Unvollständige oder schlecht geformte Schlüssel werden nicht gelöscht.

Diese Registrierung ist nur bei der ersten Installation erforderlich. Das folgende Beispiel zeigt das korrekte Format des Registrierungsschlüssels, der für die Registrierung von Drucker-Erweiterungen verwendet wird.

Hinweis

[OfflineRoot] wird als Kurzform für HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Print\OfflinePrinterExtensions verwendet.

[OfflineRoot]
    \[PrinterExtensionId] {GUID}
           AppPath=[PrinterExtensionAppPath] {String}
           \[PrinterDriverId] {GUID}
                  \[PrinterExtensionReasonGuid]
(default) = ["0"|"1"] {REG_SZ 0:Unregister, 1:Register}
                  \…
                  \[PrinterExtensionReasonGuidN]
           \[PrinterDriverId2]
                  \[PrinterExtensionReasonGuid2.1]
                  \…
                  \[PrinterExtensionReasonGuid2.Z]
           …
           \[PrinterDriverIdM]
    \[PrinterExtensionId2]
    …
    \[PrinterExtensionIdT]

Der folgende Satz von Schlüsseln würde zum Beispiel eine Drucker-Erweiterung mit der {PrinterExtensionIDGuid} PrinterExtensionID und einen voll qualifizierten Pfad zur ausführbaren Datei „C:\Programme\Fabrikam\pe.exe“ für die {PrinterDriverID1Guid} und {PrinterDriverID2Guid} PrinterDriverIDs, mit den Gründen für die Druckereinstellungen und Druckerbenachrichtigungen.

[OfflineRoot]
    \{PrinterExtensionIDGuid}
           AppPath="C:\Program Files\Fabrikam\pe.exe"
           \{PrinterDriverID1Guid}
                 \{EC8F261F-267C-469F-B5D6-3933023C29CC}
            (default) = "1"
                 \{23BB1328-63DE-4293-915B-A6A23D929ACB}
            (default) = "1"
           \{PrinterDriverID1Guid}
                 \{EC8F261F-267C-469F-B5D6-3933023C29CC}
            (default) = "1"
                 \{23BB1328-63DE-4293-915B-A6A23D929ACB}
            (default) = "1"

Um dieselbe Drucker-Erweiterung zu deinstallieren, müssen Sie die folgenden Schlüssel angeben.

[OfflineRoot]
    \{PrinterExtensionIDGuid}
           AppPath="C:\Program Files\Fabrikam\pe.exe"
           \{PrinterDriverID1Guid}
                 \{EC8F261F-267C-469F-B5D6-3933023C29CC}
            (default) = "0"
                 \{23BB1328-63DE-4293-915B-A6A23D929ACB}
            (default) = "0"
           \{PrinterDriverID1Guid}
                 \{EC8F261F-267C-469F-B5D6-3933023C29CC}
            (default) = "0"
                 \{23BB1328-63DE-4293-915B-A6A23D929ACB}
            (default) = "0"

Da Druckererweiterungen sowohl in einem vom Benutzer als auch in einem von einem Ereignis gestarteten Kontext ausgeführt werden können, ist es nützlich, den Kontext bestimmen zu können, in dem Ihre Druckererweiterung arbeitet. So kann eine App z.B. nicht den Status aller Warteschlangen auflisten, wenn sie für eine Benachrichtigung oder Druckeinstellungen gestartet wurde. Microsoft empfiehlt, dass Druckererweiterungen, die getrennt vom Treiber installiert werden (z.B. mit einer MSI oder setup.exe), Befehlszeilenschalter entweder auf den Verknüpfungen im Startmenü oder im AppPath-Eintrag, der während der Registrierung in die Registrierung eingetragen wurde, verwenden sollten. Da Drucker-Erweiterungen, die mit dem Treiber installiert werden, im DriverStore installiert werden, werden diese nicht außerhalb der Druckeinstellungen oder Druckbenachrichtigungen gestartet. Daher wird die Angabe von Befehlszeilenschaltern in diesem Fall nicht unterstützt.

Wenn sich die Drucker-Erweiterung für die aktuelle PrinterDriverID registriert, muss sie die PrinterDriverID in den AppPath aufnehmen. Für eine Drucker-Erweiterungs-App mit dem Namen printerextension.exeund einem PrinterDriverID-Wert von {GUID}würde der [PrinterExtensionAppPath] beispielsweise wie folgt aussehen:

"C:\program files\fabrikam\printerextension.exe {GUID}"

Ereignisse aktivieren

Zur Laufzeit müssen die Drucker-Erweiterungen die Ereignisauslösung für die aktuelle PrinterDriverID aktivieren. Dies ist die PrinterDriverID, die über das Array args[] an die Anwendung übergeben wurde. Sie ermöglicht es dem Drucksystem, einen geeigneten Ereigniskontext für die Handhabung von Gründen wie Druckeinstellungen oder Druckerbenachrichtigungen bereitzustellen.

Die Anwendung sollte also einen neuen PrinterExtensionManager für die aktuelle PrinterDriverID erstellen, einen Delegaten zur Behandlung des OnDriverEvent-Ereignisses registrieren und die Methode EnableEvents mit der PrinterDriverID aufrufen. Der folgende Codeschnipsel veranschaulicht diesen Ansatz.

PrinterExtensionManager mgr = new PrinterExtensionManager();
mgr.OnDriverEvent += OnDriverEvent;
mgr.EnableEvents(new Guid(PrinterDriverID1));

Wenn eine App EnableEvents nicht innerhalb von 5 Sekunden aufruft, nimmt Windows eine Zeitüberschreitung hin und startet eine Standard-Benutzeroberfläche. Um dies zu vermeiden, sollten Druckererweiterungen die neuesten Best Practices zur Leistungssteigerung befolgen, darunter die folgenden:

  • Verzögern Sie die Initialisierung der App so weit wie möglich, bis Sie EnableEvents aufrufen. Danach sollten Sie der Reaktionsfähigkeit der Benutzeroberfläche Priorität einräumen, indem Sie asynchrone Methoden verwenden und den UI-Thread während der Initialisierung nicht blockieren.

  • Verwenden Sie ngen, um während der Installation ein natives Image zu erzeugen. Weitere Informationen finden Sie unter Native Image Generator.

  • Verwenden Sie Tools zur Leistungsmessung, um Leistungsprobleme beim Laden zu finden. Weitere Informationen finden Sie unter Windows Performance Analysis Tools.

TreiberEreignis-Handler

Nachdem ein OnDriverEvent-Handler registriert und Ereignisse aktiviert wurden, wird der Handler aufgerufen, wenn die Drucker-Erweiterung gestartet wurde, um Druckeinstellungen oder Druckerbenachrichtigungen zu verarbeiten. Im vorangegangenen Codeschnipsel wurde eine Methode namens OnDriverEvent als Ereignisbehandler registriert. In dem folgenden Codeschnipsel ist der Parameter PrinterExtensionEventArgs das Objekt, mit dem die Szenarien für die Druckeinstellungen und die Druckerbenachrichtigungen erstellt werden können. PrinterExtensionEventArgs ist ein Wrapper für IPrinterExtensionEventArgs.

static void OnDriverEvent(object sender, PrinterExtensionEventArgs eventArgs)
{
    //
    // Display the print preferences window.
    //

    if (eventArgs.ReasonId.Equals(PrinterExtensionReason.PrintPreferences))
    {
        PrintPreferenceWindow printPreferenceWindow = new PrintPreferenceWindow();
        printPreferenceWindow.Initialize(eventArgs);

        //
        // Set the caller application's window as parent/owner of the newly created printing preferences window.
        //

        WindowInteropHelper wih = new WindowInteropHelper(printPreferenceWindow);
        wih.Owner = eventArgs.WindowParent;

        //
        // Display a modal/non-modal window based on the 'WindowModal' parameter.
        //

        if (eventArgs.WindowModal)
        {
            printPreferenceWindow.ShowDialog();
        }
        else
        {
            printPreferenceWindow.Show();
        }
    }

    //
    // Handle driver events.
    //

    else if (eventArgs.ReasonId.Equals(PrinterExtensionReason.DriverEvent))
    {
        // Handle driver events here.
    }
}

Um ein schlechtes Benutzererlebnis in Verbindung mit Abstürzen oder langsamen Druckererweiterungen zu vermeiden, implementiert Windows eine Zeitüberschreitung, wenn EnableEvents nicht innerhalb einer kurzen Zeitspanne nach dem Start der App aufgerufen wird. Um das Debugging zu ermöglichen, wird diese Zeitüberschreitung deaktiviert, wenn ein Debugger mit dem PrintNotify-Dienst verbunden ist.

In den meisten Fällen wird jedoch der gesamte app-bezogene Code, an dem wir interessiert sind, während oder nach dem OnDriverEvent-Callback ausgeführt. Während der Entwicklung kann es auch nützlich sein, eine MessageBox anzuzeigen, bevor Sie entweder eine Druckvoreinstellung oder eine Druckerbenachrichtigung über den OnDriverEvent-Callback starten. Wenn die MessageBox erscheint, gehen Sie zurück zu Visual Studio und wählen Sie Debug>Attach to Process und wählen Sie den Namen Ihres Prozesses. Gehen Sie schließlich zurück zu Ihrer MessageBox und wählen Sie OK, um fortzufahren. Dadurch wird sichergestellt, dass Sie Ausnahmen sehen und ab diesem Zeitpunkt alle Haltepunkte treffen.

Neue ReasonIds können in Zukunft unterstützt werden. Daher müssen Drucker-Erweiterungen die ReasonID explizit überprüfen und dürfen keine „else"-Anweisung verwenden, um die letzte bekannte ReasonID zu ermitteln. Wenn eine ReasonID empfangen wird und diese unbekannt ist, sollte die App ordnungsgemäß beendet werden.

Die Druckeinstellungen werden über das Objekt PrintSchemaEventArgs.Ticket gesteuert. Dieses Objekt kapselt sowohl die Druckerticket- als auch die Druckeigenschaften-Dokumente, die die Funktionen und Optionen für ein Gerät beschreiben. Das zugrunde liegende XML ist zwar auch verfügbar, aber das Objektmodell erleichtert die Arbeit mit diesen Formaten.

Innerhalb jedes IPrintSchemaTicket oder IPrintSchemaCapabilities-Objekts gibt es sind Merkmale (IPrintSchemaFeature) und Optionen (IPrintSchemaOption). Während die für Funktionen und Optionen verwendeten Schnittstellen unabhängig von der Herkunft gleich sind, variiert das Verhalten aufgrund des zugrunde liegenden XML leicht. In Druckeigenschaften-Dokumenten werden beispielsweise viele Optionen pro Funktion angegeben, während in Druckereigenschaften-Dokumenten nur die ausgewählte (oder Standard-) Option angegeben wird. Ebenso werden in Druckeigenschaften-Dokumenten lokalisierte Anzeigestrings angegeben, in Druckerticket-Dokumenten hingegen nicht.

Weitere Informationen zur Datenbindung in WPF finden Sie unter Übersicht über die Datenbindung.

Um die Leistung zu maximieren, empfiehlt Microsoft, GetPrintCapabilities nur dann aufzurufen, wenn eine Aktualisierung des Druckeigenschaften-Dokuments erforderlich ist.

Wenn ein Benutzer mit Hilfe der datengebundenen ComboBox-Steuerelemente eine Auswahl trifft, wird das PrintTicket-Objekt automatisch aktualisiert. Wenn der Benutzer schließlich auf OKklickt, beginnt eine Kette von asynchronen Überprüfungen und Vervollständigungen. Dieses asynchrone Muster wird häufig verwendet, um zu verhindern, dass lang laufende Aufgaben in UI-Threads ausgeführt werden und entweder in der Benutzeroberfläche der Druckeinstellungen oder in der Anwendung, die gerade druckt, zum Stillstand kommen. Nachfolgend finden Sie eine Liste der Schritte, die für die Bearbeitung der PrintTicket-Änderungen verwendet werden, nachdem der Benutzer auf OKgeklickt hat.

  1. Das PrintSchemaTicket wird asynchron mit der Methode IPrintSchemaTicket::ValidateAsync validiert.

  2. Wenn die asynchrone Validierung abgeschlossen ist, ruft die Common Language Runtime (CLR) die Methode PrintTicketValidateCompleted auf.

    1. Wenn die Validierung erfolgreich war, ruft sie die Methode CommitPrintTicketAsync auf. CommitPrintTicketAsync ruft die Methode IPrintSchemaTicket::CommitAsync auf. Und wenn das Update PrintTicket erfolgreich abgeschlossen ist, wird die Methode PrintTicketCommitCompleted aufgerufen, die eine Convenience-Methode aufruft, die die Methode PrinterExtensionEventArgs.Request.Complete aufruft, um anzuzeigen, dass die Druckeinstellungen abgeschlossen sind, und dann die App schließt.

    2. Andernfalls wird dem Benutzer eine Benutzeroberfläche zur Verfügung gestellt, mit der er die Einschränkung handhaben kann.

Wenn der Benutzer auf Abbrechen geklickt oder das Fenster Druckeinstellungen direkt geschlossen hat, ruft die Drucker-Erweiterung IPrinterExtensionEventArgs.Request.Cancel mit einem entsprechenden HRESULT-Wert und einer Meldung für das Fehlerprotokoll auf.

Wenn der Prozess für die Drucker-Erweiterung geschlossen wurde und die Methoden Complete oder Cancel nicht wie in den vorangegangenen Absätzen beschrieben aufgerufen wurden, kehrt das Drucksystem automatisch zur Verwendung der von Microsoft bereitgestellten Benutzeroberfläche zurück.

Um Informationen zum Gerätestatus abzurufen, können Drucker-Erweiterungen Bidi verwenden, um das Druckgerät abzufragen. Um zum Beispiel den Tintenstatus oder andere Arten von Statusinformationen über das Gerät anzuzeigen, können Drucker-Erweiterungen die Methode IPrinterExtensionEventArgs.PrinterQueue.SendBidiQuery verwenden, um Bidi-Abfragen an das Gerät zu senden. Das Abrufen des aktuellen Bidi-Status erfolgt in zwei Schritten: Sie müssen einen Event-Handler für das Ereignis OnBidiResponseReceived einrichten und die Methode SendBidiQuery mit einer gültigen Bidi-Abfrage aufrufen. Der folgende Codeschnipsel zeigt diesen zweistufigen Prozess.

PrinterQueue.OnBidiResponseReceived += new
EventHandler<PrinterQueueEventArgs>(OnBidiResponseReceived);
PrinterQueue.SendBidiQuery("\\Printer.consumables");

Wenn die Bidi-Antwort empfangen wird, wird der folgende Event-Handler aufgerufen. Dieser Event-Handler verfügt auch über eine Mocking-Implementierung des Tintenstatus, die für die Entwicklung nützlich sein kann, wenn ein Gerät nicht verfügbar ist. Das PrinterQueueEventArgs-Objekt enthält sowohl einen HRESULT als auch eine Bidi XML-Antwort. Weitere Informationen über Bidi XML-Antworten finden Sie unter Bidi Request and Response Schemas.

private void OnBidiResponseReceived(object sender, PrinterQueueEventArgs e)
{
    if (e.StatusHResult != (int)HRESULT.S_OK)
    {
        MockInkStatus();
        return;
    }

    //
    // Display the ink levels from the data.
    //

    BidiHelperSource = new BidiHelper(e.Response);
    if (PropertyChanged != null)
    {
        PropertyChanged(this, new PropertyChangedEventArgs("BidiHelperSource"));
    }
    InkStatusTitle = "Ink status (Live data)";
}

Drucker-Benachrichtigungen

Druckerbenachrichtigungen werden auf genau dieselbe Weise aufgerufen wie Druckeinstellungen. Wenn IPrinterExtensionEventArgs anzeigt, dass eine ReasonID mit der GUID von DriverEvents übereinstimmt, können wir im OnDriverEvent-Handler eine Erfahrung für die Behandlung dieses Ereignisses erstellen.

Die folgenden Variablen sind sehr hilfreich bei der Handhabung einer funktionierenden Druckermeldung.

  • PrinterExtensionEventArgs.BidiNotification - Dies enthält das Bidi XML, das die Auslösung des Ereignisses verursacht hat.

  • PrinterExtensionEventArgs.DetailedReasonId - Dies enthält die eventID GUID aus der xml-Datei des Treiberereignisses.

Das wichtigste Attribut des IPrinterExtensionEventArgs-Objekts für Benachrichtigungen ist die Eigenschaft BidiNotification. Dies enthält das Bidi XML, das das Ereignis ausgelöst hat. Weitere Informationen über Bidi XML-Antworten finden Sie unter Bidi Request and Response Schemas.

Verwalten von Druckern

Um die Rolle einer Drucker-Erweiterung als App zu unterstützen, die als Drehscheibe für die Verwaltung/Wartung von Druckern verwendet werden kann, ist es möglich, die Druckwarteschlangen aufzuzählen, für die die aktuelle Drucker-Erweiterung registriert ist, und den Status für jede Warteschlange abzurufen. Dies wird im PrinterExtensionSample-Projekt nicht demonstriert, aber der folgende Codeschnipsel könnte in die Main-Methode von App.xaml.cs eingefügt werden, um einen Event-Handler zu registrieren.

mgr.OnPrinterQueuesEnumerated += new EventHandler<PrinterQueuesEnumeratedEventArgs>(mgr_OnPrinterQueuesEnumerated);

Sobald die Warteschlangen aufgezählt sind, wird der Event-Handler aufgerufen und Statusoperationen können durchgeführt werden. Dieses Ereignis wird während der Lebensdauer der App regelmäßig ausgelöst, um sicherzustellen, dass die Liste der aufgezählten Druckwarteschlangen aktuell ist, auch wenn der Benutzer seit dem Öffnen der App weitere Warteschlangen installiert hat. Daher ist es wichtig, dass der Event-Handler nicht bei jeder Ausführung ein neues Fenster erstellt, wie der folgende Codeausschnitt zeigt.

static void mgr_OnPrinterQueuesEnumerated(object sender, PrinterQueuesEnumeratedEventArgs e)
{
    foreach (IPrinterExtensionContext pContext in e)
    {
        // show status
    }
}

Um Wartungsaufgaben mit einer Drucker-Erweiterung durchzuführen, empfiehlt Microsoft die Verwendung der älteren WritePrinter-API, wie im folgenden Pseudocode beschrieben.

OpenPrinter
    StartDocPrinter
        StartPagePrinter
          WritePrinter
        EndPagePrinter
    EndDocPrinter
ClosePrinter

Best Practices für die Leistung von Drucker-Erweiterungen

Um ein optimales Nutzererlebnis zu gewährleisten, sollten Drucker-Erweiterungen so konzipiert sein, dass sie so schnell wie möglich laden. Das Beispielprojekt für die Drucker-Erweiterung ist eine .NET-Anwendung, d.h. es wird in einer Zwischensprache (IL) erstellt, die zur Laufzeit in das entsprechende Format für die native Prozessorarchitektur kompiliert werden muss. Bei der Installation empfiehlt Microsoft, dass die Druckererweiterungen gemäß den bewährten Verfahren installiert werden, um sicherzustellen, dass die App für die native Systemarchitektur kompiliert wurde. Weitere Informationen zur Kompilierung von Code und zu den besten Installationsmethoden finden Sie unter Verbesserung der Startleistung Ihrer Desktop-Anwendungen.

Microsoft empfiehlt außerdem, dass Druckererweiterungen Initialisierungsaufgaben wie das Laden von Ressourcen aufschieben, bis die Methode EnableEvents aufgerufen wurde. Dadurch wird die Wahrscheinlichkeit minimiert, dass die App EnableEvents vor dem 5-Sekunden-Timeout für Drucker-Erweiterungen aufruft.

Nach dem OnDriverEvent-Aufruf sollten Drucker-Erweiterungen ihre Benutzeroberfläche initialisieren und so schnell wie möglich zeichnen. Dabei sollten sie, wenn möglich, asynchrone Methoden verwenden, um die Reaktionsfähigkeit sicherzustellen. Drucker-Erweiterungen sollten nicht von Netzwerkaufrufen oder Bidi abhängig sein, um den anfänglichen Fensterstatus für Druckeinstellungen oder Druckbenachrichtigungen zu erstellen.

Wenn der Benutzer über die Benutzeroberfläche Entscheidungen trifft, die sich auf das PrintTicket auswirken, sollte die Drucker-Erweiterung die Methode IPrintSchemaTicket::ValidateAsync verwenden, um Änderungen so früh wie möglich zu validieren. Schließlich sollte die Drucker-Erweiterung die Methode IPrintSchemaTicket::CommitAsync verwenden, um die Änderungen am PrintTicket zu übertragen.

Drucker-Erweiterungen werden immer prozessunabhängig von dem Prozess ausgeführt, der sie aufgerufen hat. Sie müssen also das Fensterverhalten im Auge behalten, wenn Sie eine Drucker-Erweiterung entwickeln:

  • Die Eigenschaft WindowParent von IPrinterExtensionEventArgs gibt das Handle zu dem Fenster an, das die Anwendung aufgerufen hat.
  • Die Eigenschaft WindowModal von IPrinterExtensionEventArgs gibt an, ob eine Drucker-Erweiterung (im Druckvorgaben-Modus) modal ausgeführt werden soll.

Das Beispiel für die Druckerweiterung zeigt, wie Sie eine Benutzeroberfläche erstellen, die in der Regel als oberstes Fenster gestartet wird. In einigen Fällen wird die Benutzeroberfläche jedoch nicht im Vordergrund angezeigt, z.B. wenn der Prozess, der den Aufruf der Benutzeroberfläche verursacht hat, auf einer anderen Integritätsebene läuft oder wenn der Prozess für eine andere Prozessorarchitektur kompiliert wurde. In diesem Fall sollte die Drucker-Erweiterung FlashWindowEx aufrufen, um die Erlaubnis des Benutzers anzufordern, durch Blinken des Symbols in der Taskleiste in den Vordergrund zu kommen.

Bidi Anfrage- und Antwortschemata

Übersicht zur Datenbindung

Verbesserung der Startleistung für Ihre Desktop-Anwendungen

Native Image Generator

Druckschema-Schnittstellen

Windows Leistungsanalyse-Tools