javascript 打印机-如何在 UWP 设备应用中执行打印机维护

2024-04-29 0 7,278 百度已收录

本文内容

在 Windows 8.1 中,UWP 设备应用可以执行打印维护例如对齐打印头和清洁喷嘴。 本主题使用C#版本的打印作业管理和打印机维护示例演示如何使用双向通信Bidi)来执行此设备维护。 要了解有关 UWP 设备应用的更多信息,请参阅了解 UWP 设备应用。

C# 版本的复印作业管理和打印机维护示例演示了使用 DeviceAppForPrinters2 项目中的 DeviceMaintenance.xaml.cs 文件进行打印机维护。 为了使用 Bidi,本示例使用 PrinterExtensionLibrary 项目中的打印机扩展库。 打印机扩展库提供了访问 v4 打印驱动程序的打印机扩展插槽的便捷方法。 有关详细信息,请参阅打印机扩展库概述

注意

本主题中显示代码示例基于 C# 版本的打印作业管理和打印机维护示例。 该示例还提供 JavaScript 和 C++ 版本。 请注意,此示例的 C++ 版本不包括代码库项目,因为 C++ 可以直接访问 COM。 下载示例以查看最新版本的代码。

打印机维护

Windows 8.1 v4 打印机驱动程序引入可用于设备维护的新打印机扩展套接字IPrinterBidiSetRequestCallback、IPrinterExtensionAsyncOperation 和 IPrinterQueue2。 此套接字允许将 Bidi 请求异步发送端口监视器,以便将它转换为设备和合约特定命令,然后发送到打印机。 有关详细信息,请参阅设备维护(v4 打印机驱动程序)。

暗示

C# 和 JavaScript 应用程序无法直接使用 COM API。 如果您正在编写 C# 或 JavaScript UWP 设备应用程序,请使用打印机扩展库来访问这些套接字(如本主题中所示)。

先决条件

准备:

确保打印机安装了 v4 打印驱动程序。 有关详细信息,请参阅开发 v4 打印驱动程序。

javascript 打印机-如何在 UWP 设备应用中执行打印机维护

设置开发笔记本。 有关下载工具创建开发者帐户的信息,请参阅入门

将应用程序与应用程序商店关联。 有关此信息,请参阅创建 UWP 设备应用程序。

为打印机创建设元数据并将其与应用程序关联。 有关更多信息,请参阅创建设备元数据

为应用程序的主页生成 UI。 所有 UWP 设备应用程序都可以从“开始屏幕启动,并在“开始”屏幕上全屏显示。 使用“开始”体验以与您设备的特定品牌功能匹配方式突出显示产品或服务。 它可以使用的 UI 控件类型没有特殊限制。 要开始设计全屏体验,请参阅 Microsoft Store 设计原则

如果你使用 C# 或 JavaScript 编写应用程序,请将 PrinterExtensionLibrary 项目添加到你的 UWP 设备应用程序解决方案中。 该项目可以在打印作业管理和打印机维护示例中找到。

注意

由于 C++ 可以直接访问 COM,因此 C++ 应用程序不需要单独的库来使用基于 COM 的打印机设备上下文

第 1 步:准备 Bidi 请求

设备维护套接字要求Bidi请求是字符格式XML数据。 Bidi 请求可以在应用程序中任何有意义地方构建。 例如,您可以将 Bidi 请求保存字符串常量或根据用户输入动态创建它们。 打印作业管理和打印机维护示例完全在 OnNavigateTo 方法中构造默认请求。 有关 Bidi 的详细信息,请参阅双向通信。

此示例来自文件的 OnNavigedToDeviceMaintenance.xaml.cs 方法。

string defaultBidiQuery =
    "rn" +
    "    rn" +
    "        falsern" +
    "    rn" +
    "";

javascript 打印机-如何在 UWP 设备应用中执行打印机维护

第 2 步:找到您的打印机

应用程序必须首先找到打印机,然后才能向打印机发送命令。 为此,打印作业管理和打印机维护示例包含一个名为 PrinterEnumeration 的类(在 PrinterEnumeration.cs 文件中)。 此类通过设备元数据查找与应用程序关联的所有打印机,并返回包含每台打印机的 PrinterInfo 对象列表名称和设备 ID。

此示例来自文件的 EnumeratePrinters_ClickDeviceMaintenance.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 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 对象创建一个称为打印机扩展上下文对象的上下文对象。 然后创建一个 PrinterBidiSetRequestCallback 对象并添加一调用处理程序来处理退回的调用 OnBidiResponseReceived。 最后,打印机扩展上下文的 SendBidiSetRequestAsync 方法用于发送 Bidi 字符串并退回。

此示例来自文件的 SendBidiRequest_ClickDeviceMaintenance.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 响应

javascript 打印机-如何在 UWP 设备应用中执行打印机维护

完成 Bidi“设置”操作后,将调用 PrinterBidiSetRequestCallback 类型的反弹对象。 此弹跳处理来自 HRESULT 响应的错误处理,然后触发 OnBidiResponseReceived 事件以通过storm 参数发送 Bidi 响应。

此示例演示 PrinterBidiSetRequestCallbackDeviceMaintenance.xaml.cs 文件中的类定义

internal class PrinterBidiSetRequestCallback : IPrinterBidiSetRequestCallback
{
    /// 
    /// This method is invoked when the asynchronous Bidi "Set" operation is completed.
    /// 
    public void Completed(string response, int statusHResult)
    {
        string result;
        if (statusHResult == (int)HRESULT.S_OK)
        {
            result = "The response is rn" + response;
        }
        else
        {
            result = "The HRESULT received is: 0x" + statusHResult.ToString("X") + "rn" +
                     "No Bidi response was received";
        }
        // Invoke the event handlers when the Bidi response is received.
        OnBidiResponseReceived(null, result);
    }
    /// 
    /// This event will be invoked when the Bidi 'set' response is received.
    /// 
    public event EventHandler OnBidiResponseReceived;
}

然后 Bidi 响应被发送到 OnBidiResponseReceived 方法,其中 Dispatcher 用于在 UI 线程上显示结果

此示例来自文件的 OnBidiResponseReceivedDeviceMaintenance.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适用于 Windows 8.1 的独立 SDKjavascript 打印机,然后才能完成本主题中的步骤。 安装 Microsoft Visual Studio Express for Windows 会安装不包含向导的 SDK 版本。

以下步骤生成应用程序并安装设备元数据。

启用测试签名

通过双击 DeviceMetadataWizard.exe 从 %ProgramFiles (x86)%Windows Kits8.1binx86 启动设备元数据创作向导

从“工具”菜单中,选择“启用测试签名”。

重启你的电脑

通过打开解决方案 (.sln) 文件来创建解决方案。 加载示例后,按 F7 或从底部菜单转到“构建”->“构建解决方案”。

断开卸载打印机。 需要执行此步骤javascript 打印机,以便 Windows 在上次测量设备时读取更新的设备元数据。

编辑并保存设备元数据。 要将设备应用程序链接到设备,设备应用程序必须与设备关联。 注意:如果尚未创建设备元数据,请参阅为 UWP 设备应用创建设备元数据。

如果设备元数据创作向导仍未打开,请双击 DeviceMetadataWizard.exe 以从 %ProgramFiles (x86)%Windows Kits8.1binx86 启动它。

单击编辑设备元数据。 这样,可以编辑现有的设备元数据包。

在“打开”对话框中,找到与 UWP 设备应用关联的设备元数据包。 (它的文件扩展名devicemetadata-ms。)

指定 UWP 设备应用信息页面上,在 UWP 设备应用框中输入 Microsoft Store 应用信息。 单击“导入 UWP 应用清单文件”可自动输入包名称、发布者名称和 UWP 应用 ID。

如果应用程序正在注册打印机通知,请填写“通知处理程序”框。 在“事件 ID”中,输入复制故障处理程序的名称。 在事件资产中,输入代码所在的文件的名称。

完成后,单击“下一步”,直到到达“完成”页面。

在“查看设备元数据包”页面上,确保所有设置均正确,然后选择“将设备元数据包复制到本地计算机上的元数据存储”框进行查看。 然后单击“保存”。

重新连接打印机,以便 Windows 在连接设备时读取更新的设备元数据。

相关主题

设备维护(v4 打印机驱动程序)

开发v4打印驱动程序

双向通讯

UWP 应用入门

创建 UWP 设备应用(分步指南

为 UWP 设备应用创建设备元数据(分步指南)

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

悟空资源网 javascript javascript 打印机-如何在 UWP 设备应用中执行打印机维护 https://www.wkzy.net/game/201523.html

常见问题

相关文章

官方客服团队

为您解决烦忧 - 24小时在线 专业服务