Udostępnij przez


Rozszerzenia drukarki

Ważne

Nowoczesna platforma drukowania jest preferowanym sposobem komunikacji z drukarkami w systemie Windows. Zalecamy używanie sterownika klasy skrzynki odbiorczej IPP firmy Microsoft wraz z aplikacjami do obsługi drukowania (PSA), aby dostosować środowisko drukowania w systemie Windows 10 i 11 na potrzeby opracowywania urządzeń drukarki.

Aby uzyskać więcej informacji, zobacz Print Support App v1 and v2 design guide (Przewodnik projektowania aplikacji do obsługi wydruku w wersji 1 i 2).

Aplikacje rozszerzeń drukarek obsługują preferencje drukowania i powiadomienia drukarki, gdy użytkownicy uruchamiają istniejące aplikacje na pulpicie systemu Windows.

Rozszerzenia drukarek można skompilować w dowolnym języku obsługującym model COM, ale są zoptymalizowane pod kątem tworzenia przy użyciu programu Microsoft .NET Framework 4. Rozszerzenia drukarki mogą być dystrybuowane z pakietem sterownika wydruku, jeśli są one obsługiwane przez program XCopy i nie mają zależności od zewnętrznych środowisk uruchomieniowych innych niż te dołączone do systemu operacyjnego, na przykład .NET. Jeśli aplikacja rozszerzenia drukarki nie spełnia tych kryteriów, może być dystrybuowana w postaci pakietu setup.exe lub MSI i reklamowana w interfejsie etapu urządzenia drukarki przy użyciu dyrektywy PrinterExtensionUrl określonej w manifeście v4. Gdy aplikacja rozszerzenia drukarki jest dystrybuowana za pośrednictwem pakietu MSI, istnieje możliwość dodania sterownika wydruku do pakietu lub pozostawienia go i dystrybucji sterownika oddzielnie. Element PrinterExtensionUrl jest wyświetlany w środowisku preferencji drukarki.

Administratorzy IT mają kilka opcji zarządzania dystrybucją rozszerzeń drukarek. Jeśli aplikacja jest spakowana w setup.exe lub MSI, administratorzy IT mogą używać standardowych narzędzi dystrybucji oprogramowania, takich jak Program Microsoft Endpoint Configuration Manager, lub mogą dołączać aplikacje do standardowego obrazu systemu operacyjnego. Administratorzy IT mogą również zastąpić element PrinterExtensionUrl określony w manifeście v4, jeśli edytują HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Print\Printers\<nazwę kolejki drukarki>\PrinterDriverData\PrinterExtensionUrl.

A jeśli przedsiębiorstwo zdecyduje się całkowicie zablokować rozszerzenia drukarki, można to zrobić za pomocą zasad grupy o nazwie "Konfiguracja komputera\Szablony administracyjne\Drukarki\Nie zezwalaj sterownikom drukarek w wersji 4 na wyświetlanie aplikacji rozszerzeń drukarki".

Kompilowanie rozszerzenia drukarki

Podczas opracowywania rozszerzenia drukarki należy pamiętać o sześciu głównych obszarach koncentracji uwagi. Te obszary fokusu są wyświetlane na poniższej liście.

  • Rejestracja

  • Włączanie zdarzeń

  • Program obsługi OnDriverEvent

  • Preferencje drukowania

  • Powiadomienia drukarki

  • Zarządzanie drukarkami

Rejestracja

Rozszerzenia drukarek są rejestrowane w systemie druku poprzez określenie zestawu kluczy rejestru lub informacji o aplikacji w sekcji PrinterExtensions pliku manifestu wersji 4.

Istnieją określone identyfikatory GUID, które obsługują każdy z różnych punktów wejścia dla rozszerzeń drukarki. Nie musisz używać tych identyfikatorów GUID w pliku manifestu w wersji 4, ale musisz znać wartości identyfikatora GUID, aby użyć formatu rejestru do instalacji sterownika w wersji 4. W poniższej tabeli przedstawiono wartości identyfikatora GUID dla dwóch punktów wejścia.

Punkt wejścia GUID
Preferencje drukowania {EC8F261F-267C-469F-B5D6-3933023C29CC}
Powiadomienia drukarki {23BB1328-63DE-4293-915B-A6A23D929ACB}

Rozszerzenia drukarki zainstalowane poza sterownikiem drukarki muszą być zarejestrowane przy użyciu rejestru. Dzięki temu rozszerzenia drukarki można zainstalować niezależnie od stanu buforu lub modułu konfiguracji w wersji 4 na komputerze klienckim.

Po uruchomieniu usługi PrintNotify sprawdzi ona klucze rejestru w ścieżce [OfflineRoot] i przetworzy wszystkie oczekujące rejestracje lub wyrejestrowania. Po zakończeniu wszystkich oczekujących rejestracji lub wyrejestrowania klucze rejestru są usuwane w czasie rzeczywistym. Jeśli używasz skryptu lub procesu iteracyjnego do umieszczania kluczy rejestru, może być konieczne ponowne utworzenie klucza \[PrinterExtensionID] za każdym razem, gdy określisz klucz \[PrinterDriverId]. Niekompletne lub źle sformułowane klucze nie są usuwane.

Ta rejestracja jest niezbędna tylko podczas pierwszej instalacji. W poniższym przykładzie pokazano prawidłowy format klucza rejestru używany do rejestrowania rozszerzeń drukarek.

Uwaga / Notatka

[OfflineRoot] jest używany jako skrót dla HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Print\OfflinePrinterExtensions.

[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]

Na przykład poniższy zestaw kluczy zarejestrowałby rozszerzenie drukarki za pomocą identyfikatora {PrinterExtensionIDGuid} PrinterExtensionID i w pełni kwalifikowaną ścieżkę do pliku wykonywalnegoC:\Program Files\Fabrikam\pe.exedla pliku wykonywalnego {PrinterDriverID1Guid} i {PrinterDriverID2Guid} z preferencjami drukarki i powiadomieniami drukarki.

[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"

Aby odinstalować to samo rozszerzenie drukarki, należy określić następujący zestaw kluczy.

[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"

Ponieważ rozszerzenia drukarki mogą być uruchamiane zarówno w kontekście uruchomionym przez użytkownika, jak i w kontekście uruchomionym przez zdarzenie, przydatne jest móc określić kontekst, w którym działa rozszerzenie drukarki. Dzięki temu aplikacja może na przykład nie wyliczać stanu we wszystkich kolejkach, jeśli została uruchomiona dla preferencji powiadomień lub wydruku. Microsoft zaleca, aby rozszerzenia drukarki zainstalowane oddzielnie od sterownika (na przykład za pomocą instalatora MSI lub setup.exe) używały przełączników wiersza polecenia w skrótach w menu Start lub w wpisie AppPath, który został dodany do rejestru podczas rejestracji. Ponieważ rozszerzenia drukarki zainstalowane za pomocą sterownika są instalowane w driverStore, nie będą one uruchamiane poza preferencjami drukowania ani zdarzeniami powiadomień drukarek. Dlatego określenie przełączników wiersza polecenia nie jest obsługiwane w tym przypadku.

Gdy rozszerzenie drukarki rejestruje się dla bieżącego PrinterDriverID, musi zawierać PrinterDriverID w AppPath. Na przykład dla aplikacji rozszerzenia drukarki o nazwie printerextension.exei wartości PrinterDriverID {GUID}, [PrinterExtensionAppPath] będzie wyglądać jak w poniższym przykładzie:

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

Włączanie zdarzeń

Podczas działania rozszerzenia drukarek muszą włączać wyzwalanie zdarzeń dla bieżącego identyfikatora "PrinterDriverID". Jest to identyfikator sterownika drukarki przekazany do aplikacji za pośrednictwem tablicy args[], który umożliwia systemowi drukowania zapewnienie odpowiedniego kontekstu zdarzenia dla obsługi przyczyn, takich jak preferencje drukowania lub powiadomienia drukarki.

Dlatego aplikacja powinna utworzyć nowy element PrinterExtensionManager dla bieżącego identyfikatora PrinterDriverID, zarejestrować delegata w celu obsługi zdarzenia OnDriverEvent i wywołać metodę EnableEvents za pomocą identyfikatora PrinterDriverID. Poniższy fragment kodu ilustruje to podejście.

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

Jeśli aplikacja nie wywoła funkcji EnableEvents w ciągu 5 sekund, system Windows wygaśnie i uruchomi standardowy interfejs użytkownika. Aby temu zapobiec, rozszerzenia drukarek powinny przestrzegać najnowszych najlepszych rozwiązań dotyczących wydajności, w tym następujących:

  • Opóźnij jak najwięcej inicjowania aplikacji, dopóki nie zostanie wywołana funkcja EnableEvents. Następnie przykładaj wagę do responsywności interfejsu użytkownika, używając metod asynchronicznych i nie blokując wątku interfejsu użytkownika podczas inicjowania.

  • Użyj narzędzia ngen, aby wygenerować obraz natywny podczas instalacji. Aby uzyskać więcej informacji, zobacz Natywny generator obrazów.

  • Użyj narzędzi do pomiaru wydajności, aby znaleźć problemy z wydajnością podczas ładowania. Aby uzyskać więcej informacji, zobacz Narzędzia analizy wydajności systemu Windows.

Procedura obsługi DriverEvent

Po zarejestrowaniu obsługi zdarzeń OnDriverEvent i włączeniu zdarzeń, jeśli rozszerzenie drukarki zostało uruchomione do zarządzania preferencjami drukowania lub powiadomieniami drukarki, obsługa zostanie wywołana. W poprzednim fragmencie kodu metoda o nazwie OnDriverEvent została zarejestrowana jako procedura obsługi zdarzeń. W poniższym fragmencie kodu parametr PrinterExtensionEventArgs jest obiektem, który umożliwia konstruowanie preferencji drukowania i scenariuszy powiadomień drukarek. PrinterExtensionEventArgs jest opakowaniem dla 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.
    }
}

Aby zapobiec złemu doświadczeniu użytkownika związanemu z awarią rozszerzeń drukarki lub ich powolnym działaniem, system Windows implementuje limit czasu, jeśli funkcja EnableEvents nie jest wywoływana w krótkim czasie po uruchomieniu aplikacji. Aby włączyć debugowanie, ten limit czasu jest wyłączony, jeśli do usługi PrintNotify jest dołączony debuger.

W większości przypadków jednak cały kod związany z aplikacją, w którym jesteśmy zainteresowani, jest uruchamiany podczas wywołania zwrotnego OnDriverEvent lub po nim. Podczas rozwoju może być również przydatne wyświetlenie okna dialogowego MessageBox przed rozpoczęciem konfiguracji preferencji drukowania lub powiadomień drukarki z wywołania zwrotnego OnDriverEvent. Po wyświetleniu okna komunikatu wróć do programu Visual Studio i wybierz opcję Debuguj>Dołącz do procesu, a następnie wybierz nazwę swojego procesu. Na koniec wróć do pola MessageBox i wybierz przycisk OK, aby wznowić. Zapewni to wyświetlanie wyjątków i trafianie w jakiekolwiek punkty przerwania od tego momentu.

Nowe identyfikatory przyczyn (ReasonIds) mogą być obsługiwane w przyszłości. W związku z tym rozszerzenia drukarki muszą jawnie sprawdzić identyfikator ReasonID i nie mogą używać instrukcji "else" do wykrywania ostatniego znanego identyfikatora ReasonID. Jeśli identyfikator ReasonID zostanie odebrany i nieznany, aplikacja powinna bezpiecznie zakończyć działanie.

Preferencje drukowania są sterowane przez obiekt PrintSchemaEventArgs.Ticket. Ten obiekt hermetyzuje zarówno dokumenty PrintTicket, jak i PrintCapabilities, które opisują funkcje i opcje urządzenia. Chociaż podstawowy kod XML jest również dostępny, model obiektów ułatwia pracę z tymi formatami.

Wewnątrz każdego obiektu IPrintSchemaTicket lub IPrintSchemaCapabilities istnieją funkcje (IPrintSchemaFeaTure) i opcje (IPrintSchemaOption). Chociaż interfejsy używane dla funkcji i opcji są takie same niezależnie od źródła, zachowanie różni się nieznacznie w wyniku bazowego kodu XML. Na przykład dokumenty PrintCapabilities określają wiele opcji na funkcję, podczas gdy dokumenty PrintTicket określają tylko wybraną (lub domyślną) opcję. Podobnie dokumenty PrintCapabilities określają zlokalizowane ciągi wyświetlania, natomiast dokumenty PrintTicket nie.

Aby uzyskać więcej informacji na temat powiązania danych w WPF, zobacz Omówienie powiązania danych.

Aby zmaksymalizować wydajność, firma Microsoft zaleca, aby wywołania funkcji GetPrintCapabilities odbywały się tylko wtedy, gdy jest to konieczne, aby zaktualizować dokument PrintCapabilities.

Gdy użytkownik dokonuje wyborów przy użyciu powiązanych danych kontrolek ComboBox, obiekt PrintTicket jest automatycznie aktualizowany. Gdy użytkownik na koniec kliknie przycisk OK, rozpocznie się łańcuch asynchronicznej weryfikacji i ukończenia. Ten asynchroniczny wzorzec jest szeroko używany w celu zapobiegania długotrwałemu wykonywaniu zadań w wątkach interfejsu użytkownika, co może prowadzić do zawieszeń w UI preferencji drukowania lub aplikacji drukującej. Poniżej znajduje się lista kroków używanych do przetwarzania zmian PrintTicket po kliknięciu przycisku OK przez użytkownika.

  1. Element PrintSchemaTicket jest weryfikowany asynchronicznie przy użyciu metody IPrintSchemaTicket::ValidateAsync .

  2. Po zakończeniu walidacji asynchronicznej środowisko uruchomieniowe języka wspólnego wywołuje metodę PrintTicketValidateCompleted.

    1. Jeśli walidacja zakończyła się pomyślnie, wywołuje metodę CommitPrintTicketAsync, a metoda CommitPrintTicketAsync wywołuje metodę IPrintSchemaTicket::CommitAsync . Po pomyślnym ukończeniu aktualizacji PrintTicket wywoływana jest metoda PrintTicketCommitCompleted, która uruchamia metodę pomocniczą, a ta z kolei wywołuje metodę PrinterExtensionEventArgs.Request.Complete, aby wskazać, że preferencje drukowania zostały sfinalizowane, po czym zamyka aplikację.

    2. W przeciwnym razie interfejs użytkownika jest przedstawiany użytkownikowi w celu obsługi sytuacji ograniczenia.

Jeśli użytkownik kliknął przycisk Anuluj lub zamknął okno preferencji drukowania bezpośrednio, rozszerzenie drukarki wywołuje IPrinterExtensionEventArgs.Request.Cancel z odpowiednią wartością HRESULT i komunikatem dziennika błędów.

Jeśli proces rozszerzenia drukarki został zamknięty i nie wywołano metod Complete ani Cancel zgodnie z opisem w poprzednich paragrafach, system wydruku automatycznie powróci do korzystania z interfejsu użytkownika dostarczonego przez firmę Microsoft.

Aby pobrać informacje o stanie urządzenia, rozszerzenia drukarek mogą używać platformy Bidi do wykonywania zapytań dotyczących urządzenia wydruku. Aby na przykład wyświetlić stan tuszu lub inny rodzaj stanu urządzenia, rozszerzenia drukarki mogą używać metody IPrinterExtensionEventArgs.PrinterQueue.SendBidiQuery w celu wystawienia zapytań Bidi do urządzenia. Uzyskanie najnowszego stanu bidi to proces dwuetapowy obejmujący skonfigurowanie procedury obsługi zdarzeń dla zdarzenia OnBidiResponseReceived i wywołanie metody SendBidiQuery z prawidłowym zapytaniem Bidi. Poniższy fragment kodu przedstawia ten dwuetapowy proces.

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

Po odebraniu odpowiedzi Bidi zostanie wywołana następująca procedura obsługi zdarzeń. Ta procedura obsługi zdarzeń ma również zmockowany status tuszu, co może być przydatne w fazie rozwoju, gdy urządzenie jest niedostępne. Obiekt PrinterQueueEventArgs zawiera odpowiedź HRESULT i Bidi XML. Aby uzyskać więcej informacji na temat odpowiedzi XML bidi, zobacz Bidi Request and Response Schemas (Schematy żądań i odpowiedzi w usłudze Bidi).

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

Powiadomienia drukarki

Powiadomienia drukarki są wywoływane dokładnie w taki sam sposób jak preferencje drukowania. W procedurze obsługi OnDriverEvent, jeśli element IPrinterExtensionEventArgs wskazuje, że identyfikator ReasonID jest zgodny z identyfikatorem GUID driverEvents, możemy utworzyć środowisko obsługi tego zdarzenia.

Poniższe zmienne są najbardziej przydatne w obsłudze funkcji powiadomień drukarki.

  • PrinterExtensionEventArgs.BidiNotification — Przenosi kod XML Bidi, który spowodował wyzwolenie zdarzenia.

  • PrinterExtensionEventArgs.DetailedReasonId — zawiera identyfikator GUID zdarzenia z pliku XML zdarzenia sterownika.

Najważniejszym atrybutem obiektu IPrinterExtensionEventArgs dla powiadomień jest właściwość BidiNotification. To przenosi kod XML Bidi, który spowodował wyzwolenie zdarzenia. Aby uzyskać więcej informacji na temat odpowiedzi XML bidi, zobacz Bidi Request and Response Schemas (Schematy żądań i odpowiedzi w usłudze Bidi).

Zarządzanie drukarkami

Aby obsługiwać rolę rozszerzenia drukarki jako aplikację, która może być używana jako centrum do zarządzania/konserwacji drukarek, można wyliczyć kolejki drukowania, dla których zarejestrowano bieżące rozszerzenie drukarki, i uzyskać stan dla każdej kolejki. Nie przedstawiono tego w projekcie PrinterExtensionSample, ale następujący fragment kodu można dodać do metody Main App.xaml.cs w celu zarejestrowania procedury obsługi zdarzeń.

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

Po wyliczeniu kolejek program obsługi zdarzeń jest wywoływany, a operacje związane ze stanem mogą być wykonywane. To zdarzenie jest wywoływane okresowo w trakcie działania aplikacji, aby upewnić się, że lista wyliczonych kolejek wydruku jest aktualna, nawet jeśli użytkownik zainstalował więcej kolejek od czasu jej otwarcia. W związku z tym ważne jest, aby program obsługi zdarzeń nie tworzy nowego okna za każdym razem, gdy jest wykonywany, i jest on wyświetlany w poniższym fragmencie kodu.

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

Aby wykonać zadania konserwacji przy użyciu rozszerzenia drukarki, firma Microsoft zaleca, aby starszy interfejs API writePrinter był używany zgodnie z poniższym pseudo kodem.

OpenPrinter
    StartDocPrinter
        StartPagePrinter
          WritePrinter
        EndPagePrinter
    EndDocPrinter
ClosePrinter

Najlepsze rozwiązania dotyczące wydajności rozszerzenia drukarki

Aby zapewnić najlepsze środowisko użytkownika, rozszerzenia drukarek powinny być zaprojektowane tak szybko, jak to możliwe. Przykładowy projekt rozszerzenia drukarki jest aplikacją platformy .NET, co oznacza, że jest wbudowany w język pośredni (IL), który musi zostać skompilowany w czasie wykonywania w odpowiednim formacie dla architektury procesora natywnego. Podczas instalacji firma Microsoft zaleca zainstalowanie rozszerzeń drukarek zgodnie z najlepszymi rozwiązaniami, aby upewnić się, że aplikacja została skompilowana dla natywnej architektury systemu. Aby uzyskać więcej informacji na temat najlepszych rozwiązań dotyczących kompilacji kodu i instalacji, zobacz Poprawianie wydajności uruchamiania aplikacji klasycznych.

Firma Microsoft zaleca również, aby rozszerzenia drukarek odroczyły zadania inicjalizacji, takie jak ładowanie zasobów, do momentu wywołania metody EnableEvents. Minimalizuje to prawdopodobieństwo wywołania funkcji EnableEvents przez aplikację przed upływem 5-sekundowego limitu czasu dla rozszerzeń drukarki.

Po wywołaniu funkcji OnDriverEvent rozszerzenia drukarki powinny zainicjować interfejs użytkownika i rysować tak szybko, jak to możliwe, korzystając z metod asynchronicznych w miarę możliwości, aby zapewnić responsywność. Rozszerzenia drukarek nie powinny mieć zależności od wywołań sieciowych ani Bidi w celu utworzenia początkowego stanu okna dla preferencji drukowania lub powiadomień o drukarce.

Ponieważ użytkownik dokonuje wyborów przy użyciu interfejsu użytkownika na ekranie, który ma wpływ na PrintTicket, rozszerzenie drukarki powinno korzystać z metody IPrintSchemaTicket::ValidateAsync, aby zweryfikować zmiany tak szybko, jak to możliwe. Na koniec rozszerzenie drukarki powinno użyć metody IPrintSchemaTicket::CommitAsync w celu zatwierdzenia zmian PrintTicket.

Rozszerzenia drukarki są zawsze wykonywane poza procesem, który je wywołał. Dlatego należy pamiętać o zachowaniu okna podczas tworzenia rozszerzenia drukarki:

  • Właściwość WindowParent z IPrinterExtensionEventArgs określa dojście do okna, które wywołało aplikację.
  • Właściwość WindowModal z IPrinterExtensionEventArgs określa, czy rozszerzenie drukarki (w trybie preferencji drukowania) powinno być uruchamiane modalnie.

Przykład rozszerzenia drukarki pokazuje, jak utworzyć interfejs użytkownika, który jest ogólnie uruchamiany jako najbardziej górne okno. Jednak w niektórych przypadkach interfejs użytkownika nie będzie wyświetlany na pierwszym planie, na przykład wtedy, gdy proces, który spowodował wywołanie interfejsu użytkownika, działa na innym poziomie integralności lub gdy proces jest kompilowany dla innej architektury procesora. W takim przypadku rozszerzenie drukarki powinno wywołać funkcję FlashWindowEx, aby poprosić użytkownika o pozwolenie na powrót na pierwszy plan, poprzez miganie ikoną na pasku zadań.

Schematy Żądań i Odpowiedzi Bidi

Omówienie wiązania danych

Zwiększanie wydajności uruchamiania aplikacji komputerowych

Generator obrazów natywnych

Drukuj interfejsy schematu

Narzędzia do analizy wydajności systemu Windows