自定义 UI 的驱动程序支持

重要

建议使用 Microsoft 的 IPP 收件箱类驱动程序,以及 Print Support Apps (PSA) ,在 Windows 10 和 11 中自定义打印体验,以便进行打印机设备开发。

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

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

以下部分介绍了更多 UI 自定义设计注意事项。

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

打印机扩展或 UWP 设备应用中的某些约束验证在提供高度信息丰富的交互式体验方面可能有所帮助,但它不应取代驱动程序的验证,后者被视为权威。

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

打印机通知

打印机通知由 Bidi 和 DriverEvent XML 文件驱动。 但是,为了更好地管理电池使用时间并将中断降到最低,仅当用户打印时才会显示通知。

虽然打印首选项与正在打印的应用相关,但打印机通知不会。 以下流程图说明了 Windows 用于确定打印机通知行为的决策树。 如果可用,UWP 设备应用优先于打印机扩展。

打印机通知行为流程图。

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

创建驱动程序事件。 V4 打印驱动程序使用 DriverEvent XML 文件来描述应引发驱动程序事件的 Bidi 查询和触发器。 请务必注意,驱动程序事件仅支持标准字符串。 有关标准字符串的详细信息,请参阅 AsyncUI 默认资源文件字符串资源。 在当前实现中,这将导致使用 MS-PAN 协议创建和发布 AsyncUIBalloon 消息。 此实现将来可能会更改以提高性能,因此开发 v4 打印驱动程序,使其不依赖于基础协议至关重要。

下图显示了协议利用率。

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

驱动程序事件 XML 示例。 以下 XML 代码片段指定一个驱动程序事件。 该事件检查黄色墨迹是否小于 Bidi 报告的总容量的 21%。 如果发生这种情况,则会使用 resourceID 132 引用的字符串创建 AsyncUIBalloon 消息。 换句话说,该消息会说“%1'的碳粉/墨迹不足”。其中 Resource 2002 (“Yellow”) 将替换为 %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 协议