自定义 UI 的驱动程序支持

重要

新式打印平台是 Windows 与打印机通信的首选方式。 建议使用 Microsoft 的 IPP 收件箱类驱动程序以及打印支持应用 (PSA) 来自定义 Windows 10 和 11 中的打印体验,以便进行打印机设备开发。

有关详细信息,请参阅新式打印平台打印支持应用设计指南

v4 打印驱动程序模型的开发内置了对 UI 自定义的支持,可使用打印机扩展或 UWP 设备应用程序进行打印。

下文将介绍更多 UI 自定义设计的注意事项。

所有 v4 打印驱动程序都与打印首选项配合使用,但必须保持配置层和 UI 层之间的界限,以确保在所有情况下保持最大程度的一致性。 由于可能没有安装任何打印机扩展或 UWP 设备应用,或者它们可能是自动安装的,因此 v4 打印驱动程序需要确保打印驱动程序在没有自定义打印机首选项体验的情况下也能正常运行。 具体而言,这意味着在驱动程序的 GPD/PPD + JavaScript 约束实现中,对 PrintTicket 和 PrintCapabilities 的支持应该是完整而全面的。

打印机扩展或 UWP 设备应用中的一些约束验证有助于提供信息丰富的交互式体验,但不应该取代被视为权威的驱动程序验证。

打印机扩展和 UWP 设备应用应使用 IPrinterQueue::SendBidiQuery 方法,而不是直接调用网络资源。 如果必须联系网络资源,则应在另一个线程上进行,或以异步方式进行,以防止 UI 挂起。 数据检索后应缓存,以便将来调用时更快。

打印机通知

打印机通知由 Bidi 和 DriverEvent XML 文件驱动。 但是,为了更好地管理电池使用时间并尽量减少中断,只有在用户正在打印时才会显示通知。

打印首选项与正在打印的应用的上下文有关,而打印机通知则不然。 以下流程图解释了 Windows 用来确定打印机通知行为的决策树。 如果可用,UWP 设备应用优先于打印机扩展。

打印机通知行为流程图。

需要注意的是,如果试图在 Windows 8 环境中调用 GetForegroundWindow 来使用自定义 UI 显示通知,则通知窗口将不会显示。 这是因为操作系统会尝试为使用 GetForegroundWindow 创建前台窗口的线程分配更高的优先级,而 Windows 8 环境中的对话框则不允许这样做。 如果想在 Windows 8 环境中使用自定义 UI 显示通知,则必须通过调用 GetDesktopWindow 来实现。

创建驱动程序事件。 V4 打印驱动程序使用 DriverEvent XML 文件来描述 Bidi 查询和应导致驱动程序事件发生的触发器。 值得注意的是,驱动程序事件只支持标准字符串。 有关标准字符串的详细信息,请参阅 AsyncUI 默认资源文件字符串资源。 在当前的实现中,这将导致使用 MS-PAN 协议创建和发布 AsyncUIBalloon 消息。 这种实现方式将来可能会为提高性能而改变,因此开发 v4 打印驱动程序时必须避免依赖基础协议。

下图显示了协议利用率。

协议利用率与驱动程序事件。

驱动程序事件 XML 示例。 以下 XML 代码段指定了一个驱动程序事件。 根据 Bidi 的报告,此次活动检查的黄色墨水不到总容量的 21%。 如果出现这种情况,就会创建一个 AsyncUIBalloon 消息,其中包含资源 ID 132 引用的字符串。 换句话说,信息将显示“‘%1’墨粉/墨水不足。”其中,资源 2002(“黄色”)将被替换为 %1。

<de:DriverEvents xmlns:de="https://schemas.microsoft.com/windows/2011/08/printing/driverevents" schemaVersion="4.0">
  <DriverEvent eventId="{A04CF0FC-1CEB-4C62-B967-6F0AE5C5F81E}">
    <Transport>USB</Transport>
    <Transport>WSD</Transport>
    <Query>\Printer.Consumables</Query>
    <Trigger result="\Printer.Consumables.Yellow:Level" comparison="LessThan" value="21">
      <StandardMessage resourceId="132">
        <StringParameter index="1" resourceId="2002" />
      </StandardMessage>
    </Trigger>
  </DriverEvent>
</de:DriverEvents>

驱动程序事件架构。 DriverEvent 架构在 Windows 驱动程序工具包中以 \Include\um\PrinterDriverEvents.xsd 的形式提供。

驱动程序事件 XML 验证。 只要在驱动程序清单中正确描述 DriverEvent XML,INFGate 工具就会自动验证 XML 文件。

AsyncUIBalloon

AsyncUI 默认资源文件字符串资源

IPrinterQueue::SendBidiQuery

MS-PAN 协议