DocumentEvent 函数是与打印文档关联的事件的事件处理程序。
语法
HRESULT DocumentEvent(
  _In_  HANDLE hPrinter,
  _In_  HDC    hdc,
        INT    iEsc,
        ULONG  cbIn,
  _In_  PVOID  pvIn,
        ULONG  cbOut,
  _Out_ PVOID  pvOut
);
参数
hPrinter [in]
打印机对象的句柄。 使用 OpenPrinter 或 AddPrinter 函数检索打印机句柄。
hdc [in]
由 CreateDC 调用生成的设备上下文句柄。 如果 iEsc 设置为 DOCUMENTEVENT_CREATEDCPRE,则为零。 有关从 64 位版本的 Windows 上的 32 位应用程序打印的限制,请参阅“备注”。
iEsc
标识要处理的事件的转义代码。 此参数可为下列整数常量之一。
| 常数 | 活动 | 
|---|---|
| 
 | GDI 即将处理对其 AbortDoc 函数的调用。 | 
| 
 | GDI 刚刚处理了对其 CreateDC 或 CreateIC 函数的调用。 除非之前已调用 documentEvent 且 iEsc 设置为DOCUMENTEVENT_CREATEDCPRE,否则不应使用此转义代码。 | 
| 
 | GDI 即将处理对其 CreateDC 或 CreateIC 函数的调用。 | 
| 
 | GDI 即将处理对其 DeleteDC 函数的调用。 | 
| 
 | GDI 刚刚处理了对其 EndDoc 函数的调用。 | 
| 
 | GDI 即将处理对其 EndDoc 函数的调用。 | 
| 
 | GDI 即将处理对其 EndPage 函数的调用。 | 
| 
 | GDI 即将处理对其 ExtEscape 函数的调用。 | 
| 
 | DOCUMENTEVENT_QUERYFILTER 事件表示后台处理程序有机会查询驱动程序,以获取驱动程序将响应的 DOCUMENTEVENT_ XXX 事件列表。 此事件是在调用通过 DOCUMENTEVENT_CREATEDCPRE 事件的 DocumentEvent 之前发出的。 | 
| 
 | GDI 刚刚处理了对其 ResetDC 函数的调用。 除非之前已调用 DocumentEvent 且 iEsc 设置为DOCUMENTEVENT_RESETDCPRE,否则不应使用此转义代码。 | 
| 
 | GDI 即将处理对其 ResetDC 函数的调用。 | 
| 
 | GDI 刚刚处理了对其 StartDoc 函数的调用。 | 
| 
 | GDI 即将处理对其 StartDoc 函数的调用。 | 
| 
 | GDI 即将处理对其 StartPage 函数的调用。 | 
cbIn
pvIn 指向的缓冲区的大小(以字节为单位)。
pvIn [in]
指向缓冲区的指针。 缓冲区包含的内容取决于 iEsc 的值,如下表所示。
| 常数 | pvin 内容 | 
|---|---|
| 
 | 未使用。 | 
| 
 | pvIn 包含指向在上一次调用此函数中 pvOut 参数中指定的 DEVMODE 结构的指针的地址,其中 iEsc 参数设置为 DOCUMENTEVENT_CREATEDCPRE。 | 
| 
 | pvIn 指向 Windows 驱动程序开发工具包中记录的 DOCEVENT_CREATEDCPRE 结构。 | 
| 
 | 未使用。 | 
| 
 | 未使用。 | 
| 
 | 未使用。 | 
| 
 | 未使用。 | 
| 
 | pvIn 指向 Windows 驱动程序开发工具包中记录的 DOCEVENT_ESCAPE 结构。 | 
| 
 | 与 DOCUMENTEVENT_CREATEDCPRE 相同。 | 
| 
 | pvIn 包含指向在上一次调用此函数中 pvOut 参数中指定的 DEVMODE 结构的指针的地址,其中 iEsc 参数设置为 DOCUMENTEVENT_RESETDCPRE。 | 
| 
 | pvIn 包含指向 ResetDC 调用方提供的 DEVMODE 结构的指针的地址。 | 
| 
 | pvIn 指向指定 StartDoc 返回的打印作业标识符的 LONG。 | 
| 
 | pvIn 包含指向 StartDoc 调用方提供的 DOCINFO 结构的指针的地址。 | 
| 
 | 未使用。 | 
cbOut
| 值 | 含义 | 
|---|---|
| IDOCUMENTEVENT_QUERYFILTER | pvOut 指向的缓冲区的大小(以字节为单位)。 | 
| DOCUMENTEVENT_ESCAPE | 用作 ExtEscape 的 cbOutput 参数的值。 | 
| 对于所有其他值 | 未使用 iEsc。 | 
pvOut [out]
指向缓冲区的指针。 缓冲区的内容取决于为 iEsc 提供的值,如下表所示。
| 常数 | pvOut 内容 | 
|---|---|
| 
 | 指向驱动程序提供的 DEVMODE 结构的指针,GDI 使用该结构,而不是 CreateDC 调用方提供的结构。 (如果 NULL,GDI 使用调用方提供的结构。) | 
| 
 | 指向用作 ExtEscape 的 lpszOutData 参数的缓冲区的指针。 | 
| 
 | 指向包含 Windows 驱动程序开发工具包中记录的 DOCEVENT_FILTER 结构的缓冲区的指针。 | 
| 
 | 指向驱动程序提供的 DEVMODE 结构的指针,GDI 使用该结构,而不是 ResetDC 调用方提供的结构。 (如果 NULL,GDI 使用调用方提供的结构。) | 
返回值
函数的返回值取决于为 iEsc 提供的转义。 对于某些转义代码,未使用返回值(请参阅下文)。 如果函数提供返回值,则它必须是下列值之一。
| 返回值 | 含义 | 
|---|---|
| DOCUMENTEVENT_FAILURE | 驱动程序支持 iEsc 标识的转义代码,但发生了故障。 | 
| DOCUMENTEVENT_SUCCESS | 驱动程序已成功处理 iEsc 标识的转义代码。 | 
| DOCUMENTEVENT_UNSUPPORTED | 驱动程序不支持 iEsc 标识的转义代码。 | 
以下列表指示需要返回值和不返回值的转义代码,并说明 DOCUMENTEVENT_SUCCESS、DOCUMENTEVENT_FAILURE 和 DOCUMENTEVENT_UNSUPPORTED 返回代码的含义。
| 返回值 | 含义 | 
|---|---|
| DOCUMENTEVENT_ABORTDOC | 返回值未使用,不应读取。 | 
| DOCUMENTEVENT_CREATEDCPOST | 返回值未使用,不应读取。 | 
| DOCUMENTEVENT_CREATEDCPRE | DOCUMENTEVENT_FAILURE - GDI 不创建设备上下文或信息上下文,并为 CreateDC 或 CreateIC 提供返回值 0。 | 
| DOCUMENTEVENT_DELETEDC | 返回值未使用,不应读取。 | 
| DOCUMENTEVENT_ENDDOCPOST | 返回值未使用,不应读取。 | 
| DOCUMENTEVENT_ENDDOCPRE 或 DOCUMENTEVENT_ENDDOC | 返回值未使用,不应读取。 | 
| DOCUMENTEVENT_ENDPAGE | 返回值未使用,不应读取。 | 
| DOCUMENTEVENT_ESCAPE | 返回值未使用,不应读取。 | 
| DOCUMENTEVENT_QUERYFILTER | 请参阅“备注”。 | 
| DOCUMENTEVENT_RESETDCPOST | 返回值未使用,不应读取。 | 
| DOCUMENTEVENT_RESETDCPRE | DOCUMENTEVENT_FAILURE - GDI 不会重置设备上下文,并为 ResetDC 提供返回值 0。 | 
| DOCUMENTEVENT_STARTDOCPOST | DOCUMENTEVENT_FAILURE - GDI 调用 AbortDoc 以停止文档,然后为 StartDoc 提供返回值 SP_ERROR。 | 
| DOCUMENTEVENT_STARTDOCPRE 或 DOCUMENTEVENT_STARTDOC | DOCUMENTEVENT_FAILURE - GDI 不启动文档,并为 StartDoc 提供返回值 SP_ERROR。 | 
| DOCUMENTEVENT_STARTPAGE | DOCUMENTEVENT_FAILURE - GDI 不启动页面,并为 StartPage 提供返回值 SP_ERROR。 | 
注解
对于DOCUMENTEVENT_QUERYFILTER的 iEsc 值,后台处理程序可以通过两种方式解释 DocumentEvent 返回的 DOCUMENTEVENT_SUCCESS 值,具体取决于驱动程序是否修改了 DOCEVENT_FILTER 结构的某些成员(该成员记录在 Windows 驱动程序开发工具包中)。 (pvOut 参数指向此结构。)当后台处理程序为此类型的结构分配内存时,它会将此结构的两个成员(cElementsReturned 和 cElementsNeeded)初始化为已知值。 DocumentEvent 返回后,后台处理程序确定这些成员的值是否已更改,并使用该信息解释 DocumentEvent 返回值。 下表总结了这种情况。
| 返回值 | cElementsReturned 和 cElementsNeeded 的状态 | 含义 | 
|---|---|---|
| DOCUMENTEVENT_SUCCESS | 驱动程序未对任一成员进行更改。 | 后台处理程序将此返回值解释为等效于 DOCUMENTEVENT_UNSUPPORTED。 后台处理程序无法从驱动程序检索事件筛选器,因此它会保留对所有事件的 DocumentEvent 调用。 | 
| DOCUMENTEVENT_SUCCESS | 驱动程序写给一个或两个成员。 | 后台处理程序接受此返回值而不解释。 如果驱动程序只写入其中一个 cElementsNeeded 和 cElementsReturned,则后台处理程序会将未更改的成员视为值为零。 后台处理程序筛选掉 DOCEVENT_FILTER 的 aDocEventCall 成员中列出的所有事件(该成员记录在 Windows 驱动程序开发工具包中)。 | 
| DOCUMENTEVENT_UNSUPPORTED | 不适用 | 驱动程序不支持 DOCUMENTEVENT_QUERYFILTER。 后台处理程序无法从驱动程序检索事件筛选器,因此它会保留对所有事件的 DocumentEvent 调用。 | 
| DOCUMENTEVENT_FAILURE | 不适用 | 驱动程序支持 DOCUMENTEVENT_QUERYFILTER,但遇到内部错误。 后台处理程序无法从驱动程序检索事件筛选器,因此它会保留对所有事件的 DocumentEvent 调用。 | 
如果 iEsc 参数中提供的转义代码为 DOCUMENTEVENT_CREATEDCPRE,则适用以下规则:
- 如果作业直接发送到打印机而不进行后台处理程序,pvIn->pszDevice 指向打印机名称。 (有关详细信息,请参阅 Windows 驱动程序开发工具包中的 DOCEVENT_CREATEDCPRE 结构文档。)
- 如果作业正在后台处理,pvIn->pszDevice 指向打印机端口名称。
注意
在 64 位版本的 Windows 上运行 32 位应用程序时,以下限制适用。 DocumentEvent 应调用的唯一 GDI 函数是 ExtEscape,只应使用专用转义。 tDocumentEven 对其他 GDI 函数的调用可能会生成未定义的行为。
要求
| 要求 | 值 | 
|---|---|
| 最低受支持的客户端 | Windows Vista [仅限桌面应用] | 
| 最低受支持的服务器 | Windows Server 2008 [仅限桌面应用] | 
| 标头 | 
 | 
| Unicode 和 ANSI 名称 | DocumentEventW (Unicode) 和 DocumentEventA (ANSI) |