Поделиться через


Как выполнять обслуживание принтера в приложении устройства UWP

В Windows 8.1 приложения устройств UWP могут выполнять обслуживание принтера, например выравнивание головок печати и очистки сопла. В этом разделе используется версия C# примера управления заданиями печати и обслуживания принтера, чтобы продемонстрировать, как двунаправленное взаимодействие (Bidi) можно использовать для выполнения такого обслуживания устройств. Дополнительные сведения о приложениях устройств UWP см. в статье "Знакомство с приложениями устройств UWP".

Версия C# примера управления заданиями печати и обслуживания принтера демонстрирует обслуживание принтера с файлом DeviceMaintenance.xaml.cs в проекте DeviceAppForPrinters2 . Для работы с Bidi в примере используется библиотека расширений принтера в проекте PrinterExtensionLibrary . Библиотека расширений принтера предоставляет удобный способ доступа к интерфейсам расширения принтера драйвера печати версии 4. Дополнительные сведения см. в обзоре библиотеки расширений принтера.

Примечание.

Примеры кода, показанные в этом разделе, основаны на версии C# примера управления заданиями печати и обслуживания принтера. Этот пример также доступен в JavaScript и C++. Обратите внимание, что поскольку C++ может напрямую получить доступ к COM, версия C++ примера не включает проекты библиотеки кода. Скачайте примеры, чтобы просмотреть последние версии кода.

Обслуживание принтера

Windows 8.1 представляет новые интерфейсы расширения принтера в драйвере принтера версии 4, который можно использовать для реализации обслуживания устройств: IPrinterBidiSetRequestCallback, IPrinterExtensionAsyncOperation и IPrinterQueue2. Эти интерфейсы позволяют асинхронно отправлять запросы Bidi на монитор портов, чтобы они могли быть преобразованы в команды устройства и протокола, а затем отправляться на принтер. Дополнительные сведения см. в разделе "Обслуживание устройств" (драйвер принтера версии 4).

Совет

Приложения C# и JavaScript не могут работать напрямую с COM-API. Если вы пишете приложение устройства C# или JavaScript UWP, используйте библиотеку расширений принтера для доступа к этим интерфейсам (как показано в этом разделе).

Необходимые компоненты

Необходимые условия:

  1. Убедитесь, что принтер установлен с помощью драйвера печати версии 4. Дополнительные сведения см. в статье "Разработка драйверов печати версии 4".

  2. Настройте компьютер разработки. Сведения о скачивании средств и создании учетной записи разработчика см. в статье "Начало работы ".

  3. Свяжите приложение с магазином. Сведения об этом см. в статье "Создание приложения устройства UWP".

  4. Создайте метаданные устройства для принтера, который связывает его с приложением. Дополнительные сведения см. в статье "Создание метаданных устройства".

  5. Создайте пользовательский интерфейс для главной страницы приложения. Все приложения устройств UWP можно запустить с начального экрана, где они будут отображаться в полноэкранном режиме. Используйте интерфейс "Пуск", чтобы выделить продукт или службы таким образом, чтобы соответствовать определенным фирменной символике и функциям ваших устройств. Существуют специальные ограничения на тип элементов управления пользовательским интерфейсом, которые он может использовать. Чтобы приступить к разработке полноэкранного интерфейса, ознакомьтесь с принципами проектирования в Microsoft Store.

  6. Если вы пишете приложение с помощью C# или JavaScript, добавьте проект PrinterExtensionLibrary в решение приложения устройства UWP. Этот проект можно найти в примере управления заданиями печати и обслуживания принтера.

Примечание.

Так как C++ может получить доступ к COM напрямую, приложения C++ не требуют отдельной библиотеки для работы с контекстом устройства принтера на основе COM.

Шаг 1. Подготовка запроса Bidi

Интерфейсы обслуживания устройств требуют, чтобы запросы Bidi были XML-данными в виде строки. Вы можете создавать запросы Bidi везде, где это имеет смысл в приложении. Например, можно сохранить запросы Bidi в виде строковых констант или динамически создавать их на основе ввода пользователем. Пример управления заданиями печати и обслуживания принтера выполняется для создания запроса по умолчанию в OnNavigatedTo методе. Дополнительные сведения о Биди см. в разделе "Двунаправленные коммуникации".

В этом примере используется OnNavigatedTo метод файла 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>";

Шаг 2. Поиск принтера

Прежде чем приложение сможет отправить команды на принтер, сначала найдите принтер. Для этого пример управления заданиями печати и обслуживания принтера включает класс с именем PrinterEnumerationфайле PrinterEnumeration.cs ). Этот класс находит все принтеры, связанные с приложением с помощью метаданных устройства, и возвращает список PrinterInfo объектов, содержащий имена и идентификаторы устройств для каждого принтера.

В этом примере используется EnumeratePrinters_Click метод файла DeviceMaintenance.xaml.cs . В нем показано, как в примере PrinterEnumeration используется класс для получения списка связанных принтеров.

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

Совет

Дополнительные сведения о файлах PrinterEnumeration и PrinterInfo классах см . в файле PrinterEnumeration.cs .

Шаг 3. Отправка запроса Bidi

Для отправки запроса Bidi интерфейсы обслуживания устройств требуют строку Bidi и обратный вызов. SendBidiRequest_Click В этом примере сначала используется PrinterInfo объект для создания объекта контекста расширения принтера с именемcontext. PrinterBidiSetRequestCallback Затем создается объект, а обработчик событий добавляется для обработки события обратного OnBidiResponseReceived вызова. Наконец, метод контекста SendBidiSetRequestAsync расширения принтера используется для отправки строки и обратного вызова Bidi.

В этом примере используется SendBidiRequest_Click метод файла 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);
    }
}

Шаг 4. Получение ответа Bidi

После завершения операции Bidi set вызывается объект обратного PrinterBidiSetRequestCallbackвызова типа. Этот обратный вызов отвечает за обработку ошибок из ответа HRESULT, а затем запускает OnBidiResponseReceived событие, отправляя ответ Bidi через параметры события.

В этом примере показано PrinterBidiSetRequestCallback определение класса в файле DeviceMaintenance.xaml.cs .

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

Затем ответ Bidi отправляется OnBidiResponseReceived в метод, где Dispatcher используется для отображения результатов в потоке пользовательского интерфейса.

В этом примере используется OnBidiResponseReceived метод файла DeviceMaintenance.xaml.cs .

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

Тестирование

Прежде чем протестировать приложение устройства UWP, его необходимо связать с принтером с помощью метаданных устройства.

Для добавления в него сведений о приложении устройства требуется копия пакета метаданных устройства. Если у вас нет метаданных устройства, его можно создать с помощью мастера создания метаданных устройств, как описано в разделе "Создание метаданных устройства для приложения устройства UWP".

Примечание.

Чтобы использовать мастер разработки метаданных устройств, необходимо установить Microsoft Visual Studio Professional, Microsoft Visual Studio Ultimate или автономный пакет SDK для Windows 8.1, прежде чем выполнить действия, описанные в этом разделе. Установка Microsoft Visual Studio Express для Windows устанавливает версию пакета SDK, которая не включает мастер.

Следующие шаги по созданию приложения и установке метаданных устройства.

  1. Включите тестовую подпись.

    1. Запустите мастер разработки метаданных устройства из %ProgramFiles(x86)%\Windows Kits\8.1\bin\x86, дважды щелкнув DeviceMetadataWizard.exe

    2. В меню "Сервис" выберите "Включить подписывание тестов".

  2. Перезагрузите компьютер.

  3. Создайте решение, открыв файл решения (.sln). Нажмите клавишу F7 или перейдите к решению сборки> из верхнего меню после загрузки примера.

  4. Отключите и удалите принтер. Этот шаг необходим, чтобы Windows считывала обновленные метаданные устройства при следующем обнаружении устройства.

  5. Изменение и сохранение метаданных устройства. Чтобы связать приложение устройства с устройством, необходимо связать приложение устройства с устройством. Примечание. Если вы еще не создали метаданные устройства, см. статью "Создание метаданных устройства" для приложения устройства UWP.

    1. Если мастер разработки метаданных устройства еще не открыт, запустите его с %ProgramFiles(x86)%\Windows Kits\8.1\bin\x86, дважды щелкнув DeviceMetadataWizard.exe.

    2. Нажмите кнопку "Изменить метаданные устройства". Это позволит изменить существующий пакет метаданных устройства.

    3. В диалоговом окне "Открыть" найдите пакет метаданных устройства, связанный с приложением устройства UWP. (Он имеет расширение файла devicemetadata-ms .)

    4. На странице сведений о приложении устройства UWP введите сведения о приложении Microsoft Store в поле приложения устройства UWP. Щелкните импорт файла манифеста приложения UWP, чтобы автоматически ввести имя пакета, имя издателя и идентификатор приложения UWP.

    5. Если приложение регистрируется для уведомлений принтера, заполните поле обработчиков уведомлений. Введите имя обработчика событий печати в идентификаторе события. В ресурсе событий введите имя файла, в котором находится этот код.

    6. По завершении нажмите кнопку "Далее ", пока не перейдете на страницу "Готово ".

    7. На странице "Проверка пакета метаданных устройства" убедитесь, что все параметры правильны и выберите пакет метаданных устройства в хранилище метаданных на локальном компьютере проверка. Нажмите кнопку Сохранить.

  6. Повторно подключите принтер, чтобы Windows считывала обновленные метаданные устройства при подключении устройства.

Обслуживание устройств (драйвер принтера версии 4)

Разработка драйверов печати версии 4

Двунаправленная связь

Начало работы с приложениями UWP

Создание приложения устройства UWP (пошаговое руководство)

Создание метаданных устройства для приложения устройства UWP (пошаговое руководство)