Udostępnij przez


Jak przeprowadzić konserwację drukarki w aplikacji na urządzeniu platformy uniwersalnej Windows

Important

Metadane urządzenia są przestarzałe i zostaną usunięte w przyszłej wersji systemu Windows. Aby uzyskać informacje o zastąpieniu tej funkcji, zobacz Driver Package Container Metadata (Metadane kontenera pakietów sterowników).

W systemie Windows 8.1 aplikacje urządzeń UWP mogą wykonywać konserwację drukarki, taką jak wyrównywanie głowic drukujących i czyszczenie dysz. W tym artykule użyto wersji języka C# przykładu Zarządzanie zadaniami drukowania i konserwacji drukarki , aby zademonstrować, w jaki sposób można użyć komunikacji dwukierunkowej (Bidi) do przeprowadzenia takiej konserwacji urządzenia. Aby dowiedzieć się więcej o aplikacjach urządzeń platformy uniwersalnej systemu Windows, zobacz Poznaj aplikacje urządzeń UWP.

Wersja języka C# przykładowego zarządzania zadaniami drukowania i konserwacji drukarki demonstruje konserwację drukarki przy użyciu pliku DeviceMaintenance.xaml.cs w projekcie DeviceAppForPrinters2 . To work with Bidi, the sample uses the printer extension library in the PrinterExtensionLibrary project. Biblioteka rozszerzeń drukarki zapewnia wygodny sposób uzyskiwania dostępu do interfejsów rozszerzeń drukarki sterownika wydruku w wersji 4. Aby uzyskać więcej informacji, zobacz Omówienie biblioteki rozszerzeń drukarki.

Note

Przykłady kodu pokazane w tym artykule są oparte na wersji języka C# przykładu Zarządzanie zadaniami drukowania i konserwacja drukarki . Ten przykład jest również dostępny w językach JavaScript i C++. Ponieważ język C++ może uzyskać bezpośredni dostęp do modelu COM, wersja języka C++ przykładu nie zawiera projektów bibliotek kodu. Pobierz przykłady, aby wyświetlić najnowsze wersje kodu.

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. Te interfejsy umożliwiają asynchroniczne wysyłanie żądań Bidi do monitora portów, aby można je było przetłumaczyć na polecenia specyficzne dla urządzenia i protokołu, a następnie wysłać do drukarki. Aby uzyskać więcej informacji, zobacz Konserwacja urządzenia (sterownik drukarki w wersji 4).

Tip

Aplikacje C# i JavaScript nie mogą pracować bezpośrednio z COM API. Jeśli piszesz aplikację urządzenia platformy UWP w języku C# lub JavaScript, użyj biblioteki rozszerzeń drukarki, aby uzyskać dostęp do tych interfejsów (jak pokazano w tym artykule).

Prerequisites

Przed rozpoczęciem pracy:

  1. Upewnij się, że drukarka jest zainstalowana przy użyciu sterownika wydruku w wersji 4. Aby uzyskać więcej informacji, zobacz Tworzenie sterowników wydruku wersji 4.

  2. Skonfiguruj komputer deweloperów. See Getting started for info about downloading the tools and creating a developer account.

  3. Skojarz aplikację ze sklepem. Aby uzyskać informacje na ten temat, zobacz Tworzenie aplikacji urządzenia uniwersalnego systemu Windows.

  4. Utwórz metadane urządzenia dla drukarki, która skojarzy ją z aplikacją. Aby uzyskać więcej informacji, zobacz Tworzenie metadanych urządzenia.

  5. Skompiluj interfejs użytkownika dla strony głównej aplikacji. Wszystkie aplikacje urządzeń platformy UWP można uruchamiać z poziomu ekranu startowego, w którym są wyświetlane w trybie pełnoekranowym. Użyj środowiska Start, aby wyróżnić produkt lub usługi w sposób zgodny z określonymi znakami i funkcjami urządzeń. Nie ma specjalnych ograniczeń dotyczących typu kontrolek interfejsu użytkownika, których może używać. Aby rozpocząć projektowanie środowiska pełnoekranowego, zobacz Zasady projektowania sklepu Microsoft Store.

  6. If you're writing your app with C# or JavaScript, add the PrinterExtensionLibrary project to your UWP device app solution. Ten projekt można znaleźć w przykładzie Zarządzanie zadaniami drukowania i konserwacja drukarki .

Note

Ponieważ język C++ może uzyskiwać bezpośredni dostęp do modelu COM, aplikacje języka C++ nie wymagają oddzielnej biblioteki do pracy z kontekstem urządzenia drukarki opartej na modelu COM.

Krok 1: Przygotowanie żądania bidi

Interfejsy do konserwacji urządzeń wymagają, aby żądania Bidi były danymi XML w formie tekstu. Możesz tworzyć swoje żądania Bidi wszędzie tam, gdzie ma to sens w Twojej aplikacji. Można na przykład zapisać żądania bidi jako stałe ciągu lub dynamicznie tworzyć je na podstawie danych wejściowych użytkownika. Przykład zarządzania zadaniami drukowania i konserwacji drukarki przykładowo tworzy domyślne żądanie w metodzie OnNavigatedTo. 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>";

Krok 2. Znajdowanie drukarki

Zanim aplikacja będzie mogła wysyłać polecenia do drukarki, musi najpierw zlokalizować drukarkę. W tym celu przykład zarządzania zadaniami drukowania i konserwacji drukarki zawiera klasę o nazwie PrinterEnumeration (w pliku PrinterEnumeration.cs ). Ta klasa znajduje wszystkie drukarki skojarzone z aplikacją za pośrednictwem metadanych urządzenia i zwraca listę PrinterInfo obiektów, które zawierają nazwy i identyfikatory urządzeń dla każdej drukarki.

This example is from the EnumeratePrinters_Click method of the DeviceMaintenance.xaml.cs file. Pokazano, jak klasa PrinterEnumeration jest używana do uzyskania listy skojarzonych drukarek w tym przykładzie.

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.

Krok 3. Wyślij żądanie Bidi

Aby wysłać żądanie Bidi, interfejsy konserwacji urządzenia wymagają ciągu Bidi i wywołania zwrotnego. W metodzie SendBidiRequest_Click próbka najpierw korzysta z obiektu PrinterInfo do utworzenia obiektu kontekstu rozszerzenia drukarki o nazwie context. PrinterBidiSetRequestCallback Następnie jest tworzony obiekt, a procedura obsługi zdarzeń jest dodawana do obsługi zdarzenia wywołania zwrotnegoOnBidiResponseReceived. Na koniec metoda kontekstu SendBidiSetRequestAsync rozszerzenia drukarki służy do wysyłania ciągu Bidi i wywołania zwrotnego.

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

Krok 4. Odbieranie odpowiedzi z oferty

Po zakończeniu operacji "set" Bidi wywoływany jest obiekt wywołania zwrotnego typu PrinterBidiSetRequestCallback. To wywołanie zwrotne zajmuje się obsługą błędów z odpowiedzi HRESULT, a następnie wyzwala OnBidiResponseReceived zdarzenie, wysyłając odpowiedź Bidi za pośrednictwem parametrów zdarzenia.

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

Odpowiedź Bidi jest następnie wysyłana do metody OnBidiResponseReceived, gdzie element Dispatcher służy do wyświetlania wyników w wątku UI.

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

Aby można było przetestować aplikację urządzenia platformy UWP, należy ją połączyć z drukarką przy użyciu metadanych urządzenia.

Aby dodać do niego informacje o aplikacji urządzenia, potrzebna jest kopia pakietu metadanych urządzenia dla drukarki. Jeśli nie masz metadanych urządzenia, możesz je skompilować przy użyciu Kreatora tworzenia metadanych urządzenia zgodnie z opisem w artykule Tworzenie metadanych urządzenia dla aplikacji urządzenia platformy UWP.

Note

Aby użyć Kreatora tworzenia metadanych urządzenia, należy zainstalować program Microsoft Visual Studio Professional, Microsoft Visual Studio Ultimate lub autonomiczny zestaw SDK dla systemu Windows 8.1 przed wykonaniem kroków opisanych w tym artykule. Zainstalowanie programu Microsoft Visual Studio Express dla systemu Windows powoduje zainstalowanie wersji zestawu SDK, która nie zawiera kreatora.

W poniższych krokach skompiluj aplikację i zainstaluj metadane urządzenia.

  1. Włącz podpisywanie testowe.

    1. Uruchom Kreatora tworzenia metadanych urządzenia z %ProgramFiles(x86)%\Windows Kits\8.1\bin\x86, klikając dwukrotnie DeviceMetadataWizard.exe

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

  2. Uruchom ponownie komputer

  3. Skompiluj rozwiązanie, otwierając plik rozwiązania (.sln). Naciśnij F7 lub przejdź do pozycji Kompiluj rozwiązanie> z górnego menu po załadowaniu przykładu.

  4. Odłącz i odinstaluj drukarkę. Ten krok jest wymagany, aby system Windows odczytał zaktualizowane metadane urządzenia przy następnym wykryciu urządzenia.

  5. Edytowanie i zapisywanie metadanych urządzenia. Aby połączyć aplikację urządzenia z urządzeniem, musisz skojarzyć aplikację urządzenia z urządzeniem. Jeśli metadane urządzenia nie zostały jeszcze utworzone, zobacz Tworzenie metadanych urządzenia dla aplikacji urządzenia platformy UWP.

    1. Jeśli Kreator tworzenia metadanych urządzenia nie jest jeszcze otwarty, uruchom go od %ProgramFiles(x86)%\Windows Kits\8.1\bin\x86, klikając dwukrotnie DeviceMetadataWizard.exe.

    2. Wybierz pozycję Edytuj metadane urządzenia. Ta opcja umożliwia edytowanie istniejącego pakietu metadanych urządzenia.

    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. Na stronie Określanie informacji o aplikacji urządzenia UWP wprowadź informacje o aplikacji ze Sklepu Microsoft w polu tekstowym Aplikacja urządzenia platformy UWP. Wybierz pozycję Importuj plik manifestu aplikacji platformy UWP , aby automatycznie wprowadzić nazwę pakietu, nazwę wydawcy i identyfikator aplikacji platformy UWP.

    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. Na stronie Przeglądanie pakietu metadanych urządzenia upewnij się, że wszystkie ustawienia są poprawne, a następnie zaznacz pole wyboru Kopiuj pakiet metadanych urządzenia do magazynu metadanych na komputerze lokalnym . Then select Save.

  6. Połącz ponownie drukarkę, aby system Windows odczytał zaktualizowane metadane urządzenia po nawiązaniu połączenia z urządzeniem.