DrvDocumentEvent 函数 (winddiui.h)

打印机接口 DLL 的 DrvDocumentEvent 函数可以处理与打印文档相关的某些事件。

语法

int DrvDocumentEvent(
        HANDLE hPrinter,
        HDC    hdc,
        int    iEsc,
        ULONG  cbIn,
  [in]  PVOID  pvIn,
        ULONG  cbOut,
  [out] PVOID  pvOut
);

参数

hPrinter

调用方提供的打印机句柄。

hdc

调用方提供的设备上下文句柄,由 CreateDC 如果 iEsc 设置为 DOCUMENTEVENT_CREATEDCPRE,则为零。 有关从 64 位版本的 Windows 上的 32 位应用程序打印的限制,请参阅下面的 备注 部分。

iEsc

调用方提供的转义代码标识要处理的事件。

有关从 64 位版本的 Windows 上的 32 位应用程序打印的限制,请参阅下面的 备注 部分。

此参数可以是下列整数常量之一:

iEsc 常量 事件
DOCUMENTEVENT_ABORTDOC GDI 即将处理对其 AbortDoc 函数的调用。
DOCUMENTEVENT_CREATEDCPOST GDI 刚刚处理了对其 CreateDCCreateIC 函数的调用。 除非先前已调用 DrvDocumentEvent且 iEsc 设置为DOCUMENTEVENT_CREATEDCPRE,否则不应使用此转义代码。
DOCUMENTEVENT_CREATEDCPRE GDI 即将处理对其 CreateDCCreateIC 函数的调用。
DOCUMENTEVENT_DELETEDC GDI 即将处理对其 DeleteDC 函数的调用。
DOCUMENTEVENT_ENDDOCPOST GDI 刚刚处理了对其 EndDoc 函数的调用。
DOCUMENTEVENT_ENDDOCPRE或DOCUMENTEVENT_ENDDOC GDI 即将处理对其 EndDoc 函数的调用。
DOCUMENTEVENT_ENDPAGE GDI 即将处理对其 EndPage 函数的调用。
DOCUMENTEVENT_ESCAPE GDI 即将处理对其 ExtEscape 函数的调用。
DOCUMENTEVENT_QUERYFILTER DOCUMENTEVENT_QUERYFILTER事件表示后台处理程序有机会查询驱动程序,以获取驱动程序将响应的 DOCUMENTEVENT_XXX 事件列表。 在调用 传递DOCUMENTEVENT_CREATEDCPRE事件的 drvDocumentEvent 之前发出此事件。
DOCUMENTEVENT_RESETDCPOST GDI 刚刚处理了对其 ResetDC 函数的调用。 除非先前已调用 DrvDocumentEventiEsc 设置为DOCUMENTEVENT_RESETDCPRE,否则不应使用此转义代码。
DOCUMENTEVENT_RESETDCPRE GDI 即将处理对其 ResetDC 函数的调用。
DOCUMENTEVENT_STARTDOCPOST GDI 刚刚处理了对其 StartDoc 函数的调用。
DOCUMENTEVENT_STARTDOCPRE或DOCUMENTEVENT_STARTDOC GDI 即将处理对其 StartDoc 函数的调用。
DOCUMENTEVENT_STARTPAGE GDI 即将处理对其 StartPage 函数的调用。

cbIn

pvIn指向的缓冲区的调用方提供的大小(以字节为单位)。

[in] pvIn

调用方提供的指针,其用法取决于为 iEsc提供的值,如下所示:

iEsc 常量 pvIn 内容
DOCUMENTEVENT_ABORTDOC 未使用。
DOCUMENTEVENT_CREATEDCPOST pvIn 包含指向上一个调用此函数的 pvOut 参数中指定的 DEVMODEW 结构的指针的地址,iEsc 参数设置为DOCUMENTEVENT_CREATEDCPRE。
DOCUMENTEVENT_CREATEDCPRE pvIn 指向 DOCEVENT_CREATEDCPRE 结构。
DOCUMENTEVENT_DELETEDC 未使用。
DOCUMENTEVENT_ENDDOCPOST 未使用。
DOCUMENTEVENT_ENDDOCPRE或DOCUMENTEVENT_ENDDOC 未使用。
DOCUMENTEVENT_ENDPAGE 未使用。
DOCUMENTEVENT_ESCAPE pvIn 指向 DOCEVENT_ESCAPE 结构。
DOCUMENTEVENT_QUERYFILTER 与DOCUMENTEVENT_CREATEDCPRE相同。
DOCUMENTEVENT_RESETDCPOST pvIn 包含指向上一次调用此函数的 pvOut 参数中指定的 DEVMODEW 结构的指针的地址,其中 iEsc 参数设置为DOCUMENTEVENT_RESETDCPRE。
DOCUMENTEVENT_RESETDCPRE pvIn 包含指向 ResetDC 函数调用方提供的 DEVMODEW 结构的指针的地址。
DOCUMENTEVENT_STARTDOCPOST pvIn 指向一个 LONG,该 LONG 指定由 StartDoc 函数返回的打印作业标识符。
DOCUMENTEVENT_STARTDOCPRE或DOCUMENTEVENT_STARTDOC pvIn 包含指向 StartDoc 函数调用方提供的 DOCINFO 结构的指针的地址。
DOCUMENTEVENT_STARTPAGE 未使用。

cbOut

如果 iEsc 为 DOCUMENTEVENT_ESCAPE

用作 ExtEscape 函数的 cbOutput 参数的函数提供的值。

如果 iEsc DOCUMENTEVENT_QUERYFILTER

调用方提供的缓冲区指针的大小(以字节为单位)通过 pvOut

对于所有其他 iEsc 值

未使用。

[out] pvOut

函数提供的指向输出缓冲区的指针,其用法取决于为 iEsc提供的值,如下所示:

iEsc 常量 pvOut 内容
DOCUMENTEVENT_CREATEDCPRE 指向驱动程序提供的 DEVMODEW 结构的指针,GDI 使用该结构,而不是由 CreateDC 调用方提供的结构。 (如果 NULL,GDI 将使用调用方提供的结构。
DOCUMENTEVENT_ESCAPE 用作 ExtEscape 函数的 lpszOutData 参数的缓冲区指针。
DOCUMENTEVENT_QUERYFILTER 调用方提供的指向包含 DOCEVENT_FILTER 结构的缓冲区的指针。
DOCUMENTEVENT_RESETDCPRE 指向驱动程序提供的 DEVMODEW 结构的指针,GDI 使用该结构,而不是由 ResetDC 函数调用方提供的结构。 (如果 NULL,GDI 将使用调用方提供的结构。
所有其他 iEsc 未使用。

返回值

函数的返回值取决于为 iEsc提供的转义。 对于某些转义代码,不使用返回值(请参阅第二个值列表)。 如果函数提供返回值,则它必须是下列值之一:

返回代码 描述
DOCUMENTEVENT_FAILURE 驱动程序支持由 iEsc标识的转义代码,但发生了故障。
DOCUMENTEVENT_SUCCESS 驱动程序已成功处理由 iEsc标识的转义代码。
DOCUMENTEVENT_UNSUPPORTED 驱动程序不支持由 iEsc标识的转义代码。

言论

打印机接口 DLL 可以选择提供 DrvDocumentEvent 函数来执行与呈现文档关联的 GDI 调用的预处理或后处理。 当应用程序调用 GDI 客户端时,从用户模式 GDI 客户端调用 DrvDocumentEvent 函数。

对于 iEsc 值DOCUMENTEVENT_QUERYFILTER,后台处理程序可以通过两种方式解释 DrvDocumentEvent 返回的DOCUMENTEVENT_SUCCESS值,具体取决于驱动程序是否修改了 DOCEVENT_FILTER 结构的某些成员。 (pvOut 参数指向此结构。当后台处理程序为此类型的结构分配内存时,它会将此结构的两个成员(cElementsReturnedcElementsNeeded)初始化为已知值。 DrvDocumentEvent 返回后,后台处理程序将确定这些成员的值是否已更改,并使用该信息解释 drvDocumentEvent 返回值。 下表总结了这种情况。

返回值 cElementsReturned、cElementsNeeded 的状态 意义
DOCUMENTEVENT_SUCCESS 驱动程序未对任一成员进行更改。 后台处理程序将此返回值解释为等效于DOCUMENTEVENT_UNSUPPORTED。 后台处理程序无法从驱动程序中检索事件筛选器,因此它会保留对所有事件的调用 DrvDocumentEvent
DOCUMENTEVENT_SUCCESS 驱动程序写信给一个或两个成员。 后台处理程序接受此返回值而不解释。 如果驱动程序只写信给 cElementsNeededcElementsReturned中的一个,则后台处理程序会将未更改的成员视为值为零。 后台处理程序筛选掉 aDocEventCall 成员 DOCEVENT_FILTER中列出的所有事件。
DOCUMENTEVENT_UNSUPPORTED 不適用 驱动程序不支持DOCUMENTEVENT_QUERYFILTER。 后台处理程序无法从驱动程序中检索事件筛选器,因此它会保留对所有事件的调用 DrvDocumentEvent
DOCUMENTEVENT_FAILURE 不適用 驱动程序支持DOCUMENTEVENT_QUERYFILTER,但遇到内部错误。 后台处理程序无法从驱动程序中检索事件筛选器,因此它会保留对所有事件的调用 DrvDocumentEvent

如果转义代码名称没有后缀或后缀为 PRE,则 GDI 客户端在调用内核模式 GDI 呈现引擎之前调用 DrvDocumentEvent。 如果转义代码名称后缀为 POST,GDI 客户端将在内核模式 GDI 呈现引擎返回后调用 DrvDocumentEvent

如果 iEsc 参数中提供的转义代码DOCUMENTEVENT_CREATEDCPRE,则适用以下规则:

  • 如果作业直接发送到打印机而不进行后台处理程序,pvIn --> pszDevice 指向打印机名称。 (有关详细信息,请参阅 DOCEVENT_CREATEDCPRE 结构。

  • 如果作业正在后台处理,pvIn --> pszDevice 指向打印机端口名称。

DrvDocumentEvent 函数在 GDI 客户端函数的用户模式调用方上下文中执行。 禁用 EMF 后台处理程序后,该函数可以显示用户界面。 例如,在处理 GDI 的 StartDoc 函数之前,传真驱动程序的 DrvDocumentEvent 函数可能会向用户显示对话框。

在 64 位版本的 Windows 上运行 32 位应用程序时,以下限制适用:

  • DrvDocumentEvent 应调用的唯一 GDI 函数是 ExtEscape,只应使用专用转义。

  • DrvDocumentEvent 调用其他 GDI 函数可能会产生未定义的行为。

要求

要求 价值
目标平台 桌面
标头 winddiui.h (包括 Winddiui.h)

另请参阅

DOCEVENT_CREATEDCPRE

DOCEVENT_ESCAPE

DOCEVENT_FILTER