XPS 드라이버 문서 이벤트

Important

프린터 장치 개발을 위해 Windows 10 및 11의 인쇄 환경을 사용자 지정하려면 MICROSOFT의 IPP 받은 편지함 클래스 드라이버와 PSA(인쇄 지원 앱)를 사용하는 것이 좋습니다.

자세한 내용은 인쇄 지원 앱 디자인 가이드를 참조하세요.

Microsoft WPF(Windows Presentation Foundation) 인쇄 지원은 GDI 인쇄 지원에서 GDI 인쇄 드라이버에 알림을 보내는 방법과 유사하게 문서 스풀링 중에 XPSDrv 인쇄 드라이버 알림 이벤트를 보냅니다. WPF 인쇄 지원은 GDI 인쇄 지원에서 사용하는 것과 동일한 DrvDocumentEvent DDI 함수도 사용하지만 XPS 문서 처리 이벤트를 지원하도록 새 이벤트가 정의되었습니다. GDI 인쇄 지원은 Microsoft Win32 애플리케이션 인쇄를 위해 GDI 기반 인쇄 드라이버 및 XPSDrv 인쇄 드라이버에 DrvDocumentEvent 이벤트 처리기를 계속 발급합니다.

DrvDocumentEvent 이벤트 처리기 개요

필요한 경우 XPSDrv 인쇄 드라이버는 구성 모듈에서 DrvDocumentEvent 이벤트 처리기를 내보내 문서 처리 기능을 가로챌 수 있습니다. 새 XPS 문서 관련 이벤트는 "DOCUMENTEVENT_XPS_"로 시작하는 기호 이름으로 식별됩니다.

WPF 인쇄 지원은 인쇄를 위해 문서를 스풀하는 동안 XPSDrv 인쇄 드라이버의 DrvDocumentEvent 함수를 호출합니다. 각 호출은 프로세스의 다른 단계에서 발생합니다. 각 호출의 처리 단계는 iEsc 인수의 값으로 식별됩니다. pvIn 및 pvOut 인수에서 참조하는 버퍼의 내용은 처리 단계에 따라 달라집니다.

이 항목의 다음 하위 섹션에서는 WPF 인쇄 지원에서 생성하는 XPS 문서 처리 이벤트만 설명합니다.

DrvDocumentEvent 이벤트 처리기 설명

DrvDocumentEvent 이벤트 처리기에는 다음과 같은 호출 형식이 있습니다. 이 섹션의 코드 및 매개 변수 정의는 정보 전용입니다.

INT
  DrvDocumentEvent(
    HANDLE  hPrinter,
    HDC  hdc,
    int  iEsc,
    ULONG  cbIn,
    PVOID  pvIn,
    ULONG  cbOut,
    PVOID  pvOut
    );

매개 변수

hPrinter
WPF 인쇄 지원에서 제공하는 프린터 핸들입니다.

Hdc
CreateDC 호출에서 생성하는 호출자 제공 디바이스 컨텍스트 핸들입니다. iEsc가 DOCUMENTEVENT_CREATEDCPRE 설정된 경우 이 매개 변수는 0입니다.

문서가 인쇄되면 시스템에서 XPS 및 GDI 문서 모두에 대해 동일한 이벤트 값을 사용합니다. 드라이버는 이러한 유사성을 인식하고 hdc를 기반으로 작업 유형을 결정해야 합니다. hdc는 모든 DOCUMENTEVENT_XPS_Xxx 이벤트에 대해 INVALID_HANDLE_VALUE 같습니다. 이 검사 호출 애플리케이션을 기반으로 DrvDocumentEvent 이벤트 값의 적절한 해석을 결정합니다. 이 검사 XPSDrv 인쇄 드라이버에만 적용됩니다.

iEsc
처리할 이벤트를 식별하는 호출자 제공 이스케이프 코드입니다. 이 매개 변수는 다음 정수 상수 중 하나일 수 있습니다.

DOCUMENTEVENT_QUERYFILTER
WPF 인쇄 지원은 이 이벤트를 전송하여 드라이버가 응답할 XPS 문서 처리 이벤트 목록을 인쇄 드라이버에 쿼리합니다. 이 이벤트는 다른 XPS 문서 관련 이벤트 전에 발생합니다.

DOCUMENTEVENT_XPS_ADDFIXEDDOCUMENTSEQUENCEPRE
WPF 인쇄 지원은 XPS 스풀 파일에 FixedDocumentSequence를 추가하기 전에 이 이벤트를 보냅니다.

DOCUMENTEVENT_XPS_ADDFIXEDDOCUMENTSEQUENCEPOST
WPF 인쇄 지원은 XPS 스풀 파일에 FixedDocumentSequence를 추가한 후 이 이벤트를 보냅니다.

DOCUMENTEVENT_XPS_ADDFIXEDDOCUMENTPRE
WPF 인쇄 지원은 XPS 스풀 파일에 FixedDocument를 추가하기 전에 이 이벤트를 보냅니다.

DOCUMENTEVENT_XPS_ADDFIXEDDOCUMENTPOST
WPF 인쇄 지원은 XPS 스풀 파일에 FixedDocument를 추가한 후 이 이벤트를 보냅니다.

DOCUMENTEVENT_XPS_ADDFIXEDDOCUMENTSEQUENCEPRINTTICKETPRE
WPF는 FixedDocumentSequence(작업 수준)에 PrintTicket를 추가하려고 합니다.

DOCUMENTEVENT_XPS_ADDFIXEDDOCUMENTSEQUENCEPRINTTICKETPOST
WPF는 드라이버가 해당 DOCUMENTEVENT_XPS_ADDFIXEDDOCUMENTSEQUENCEPRINTTICKETPRE 이벤트에서 반환하는 데이터를 해제해야 합니다.

DOCUMENTEVENT_XPS_ADDFIXEDDOCUMENTPRINTTICKETPRE
WPF는 FixedDocument(문서 수준)에 PrintTicket를 추가하려고 합니다.

DOCUMENTEVENT_XPS_ADDFIXEDDOCUMENTPRINTTICKETPOST
WPF는 드라이버가 해당 DOCUMENTEVENT_XPS_ADDFIXEDDOCUMENTPRINTTICKETPRE 이벤트에서 반환하는 데이터를 해제해야 합니다.

DOCUMENTEVENT_XPS_ADDFIXEDPAGEPRINTTICKETPRE
WPF는 FixedPage(페이지 수준)에 PrintTicket를 추가하려고 합니다.

DOCUMENTEVENT_XPS_ADDFIXEDPAGEPRINTTICKETPOST
WPF는 드라이버가 해당 DOCUMENTEVENT_XPS_ADDFIXEDPAGEPRINTTICKETPRE 이벤트에서 반환하는 데이터를 해제합니다.

DOCUMENTEVENT_XPS_CANCELJOB
WPF 인쇄 지원은 취소 작업 작업을 호출하기 전에 이 이벤트를 보냅니다.

DOCUMENTEVENT_XPS_COMMITJOB
WPF에서 현재 파일에 날짜 작성을 완료했습니다.

cbIn
pvln 매개 변수가 참조하는 버퍼의 크기(바이트)입니다. 이 값은 WPF 인쇄 지원에서 제공되며 이벤트 처리기에서 읽습니다.

pvIn
호출자가 제공한 포인터입니다. 이 매개 변수의 사용은 다음 목록에 설명된 대로 iEsc 값에 따라 달라집니다. (DOCUMENTEVENT_XPS_이 목록에 표시되지 않는 Xxx 이벤트는 pvIn을 사용하지 않습니다.)

DOCUMENTEVENT_QUERYFILTER
pvIn은 PDOCEVENT_FILTER 구조를 가리킵니다(DOCUMENTEVENT_QUERYFILTER 경우와 동일).

DOCUMENTEVENT_XPS_ADDFIXEDDOCUMENTSEQUENCEPRE
pvIn은 세 가지 속성이 포함된 PrintPropertiesCollection 구조체(Winspool.h 참조)를 가리킵니다.

  • EPrintPropertyType::kPropertyTypeInt32(ULONG) 값인 EscapeCode입니다. EscapeCode는 이벤트 값입니다.

  • JobIdentifier- EPrintPropertyType::kPropertyTypeInt32(ULONG) 값입니다. JobIdentifier는 GetJob() 및 SetJob()을 호출하는 데 필요한 ID입니다.

  • JobName, EPrintPropertyType:: kPropertyTypeString(UNICODE) 값입니다.

DOCUMENTEVENT_XPS_ADDFIXEDDOCUMENTSEQUENCEPOST
DOCUMENTEVENT_XPS_ADDFIXEDDOCUMENTSEQUENCEPRE 경우와 동일합니다.

DOCUMENTEVENT_XPS_ADDFIXEDDOCUMENTPRE
pvIn은 다음 두 가지 속성을 포함하는 PrintPropertiesCollection 구조체(Winspool.h 참조)를 가리킵니다.

  • EPrintPropertyType::kPropertyTypeInt32(ULONG) 값인 EscapeCode입니다. EscapeCode는 이벤트 값입니다.

  • EPrintPropertyType::kPropertyTypeInt32(ULONG) 값인 DocumentNumber입니다.

DOCUMENTEVENT_XPS_ADDFIXEDDOCUMENTPOST
DOCUMENTEVENT_XPS_ADDFIXEDDOCUMENTPRE 경우와 동일합니다.

DOCUMENTEVENT_XPS_ADDFIXEDPAGEPRE
pvIn은 다음 두 가지 속성을 포함하는 PrintPropertiesCollection 구조체(Winspool.h 참조)를 가리킵니다.

  • EPrintPropertyType::kPropertyTypeInt32(ULONG) 값인 EscapeCode입니다.

  • EPrintPropertyType::kPropertyTypeInt32(ULONG) 값인 PageNumber입니다.

DOCUMENTEVENT_XPS_ADDFIXEDPAGEPOST
DOCUMENTEVENT_XPS_ADDFIXEDPAGEPRE 경우와 동일합니다.

DOCUMENTEVENT_XPS_ADDFIXEDDOCUMENTSEQUENCEPRINTTICKETPRE
pvIn은 네 가지 속성이 포함된 PrintPropertiesCollection 구조체(Winspool.h 참조)를 가리킵니다.

  • EPrintPropertyType::kPropertyTypeInt32(ULONG)인 EscapeCode입니다. EscapeCode는 이벤트 값입니다.

  • JobIdentifier- EPrintPropertyType::kPropertyTypeInt32(ULONG) 값입니다.

  • JobName, EPrintPropertyType:: kPropertyTypeString(UNICODE) 값입니다.

  • EPrintPropertyType:: kPropertyTypeByte 값인 PrintTicket입니다.

"PRE" 이벤트에 PrintPropertiesCollection 구조 및 해당 속성을 할당하고 해당 "POST" 이벤트에서 해제해야 합니다. pvOut을 NULL설정하여 이벤트를 지원하지만 지정된 문서 또는 페이지의 PrintTicket을 변경하는 데 관심이 없음을 나타낼 수 있습니다. 플러그 인은 "PRE" 이벤트와 "POST" 이벤트 간에 언로드해서는 안 됩니다.

DOCUMENTEVENT_XPS_ADDFIXEDDOCUMENTSEQUENCEPRINTTICKETPOS
pvIn 은 DOCUMENTEVENT_XPS_ADDFIXEDDOCUMENTSEQUENCEPRINTTICKETPRE pvOut과 동일한 포인터입니다.

드라이버는 pvIn을 해제해야 합니다.

DOCUMENTEVENT_XPS_ADDFIXEDDOCUMENTPRINTTICKETPRE
pvIn은 세 가지 속성이 포함된 PrintPropertiesCollection 구조체(Winspool.h 참조)를 가리킵니다.

  • EPrintPropertyType::kPropertyTypeInt32(ULONG) 값인 EscapeCode입니다. EscapeCode는 이벤트 값입니다.

  • EPrintPropertyType::kPropertyTypeInt32(ULONG) 값인 DocumentNumber입니다.

  • EPrintPropertyType:: kPropertyTypeByte 값인 PrintTicket입니다.

"PRE" 이벤트에 PrintPropertiesCollection 구조 및 해당 속성을 할당하고 해당 "POST" 이벤트에서 해제해야 합니다. pvOut을 NULL설정하여 이벤트를 지원하지만 지정된 문서 또는 페이지의 PrintTicket을 변경하는 데 관심이 없음을 나타낼 수 있습니다. 플러그 인은 "PRE" 이벤트와 "POST" 이벤트 간에 언로드해서는 안 됩니다.

DOCUMENTEVENT_XPS_ADDFIXEDDOCUMENTPRINTTICKETPOS
pvIn은 DOCUMENTEVENT_XPS_ADDFIXEDDOCUMENTPRINTTICKETPRE pvOut동일한 포인터입니다.

드라이버는 pvIn을 해제해야 합니다.

DOCUMENTEVENT_XPS_ADDFIXEDPAGEPRINTTICKETPRE
pvIn은 세 가지 속성이 포함된 PrintPropertiesCollection 구조체(Winspool.h 참조)를 가리킵니다.

  • EPrintPropertyType::kPropertyTypeInt32(ULONG) 값인 EscapeCode입니다. EscapeCode는 이벤트 값입니다.

  • EPrintPropertyType::kPropertyTypeInt32(ULONG)인 PageNumber입니다.

  • EPrintPropertyType:: kPropertyTypeByte인 PrintTicket입니다.

"PRE" 이벤트에 PrintPropertiesCollection 구조 및 해당 속성을 할당하고 해당 "POST" 이벤트에서 해제해야 합니다. pvOut을 NULL설정하여 이벤트를 지원하지만 지정된 문서 또는 페이지의 PrintTicket을 변경하는 데 관심이 없음을 나타낼 수 있습니다. 플러그 인은 "PRE" 이벤트와 "POST" 이벤트 간에 언로드해서는 안 됩니다.

DOCUMENTEVENT_XPS_ADDFIXEDPAGEPRINTTICKETPOS
pvIn은 DOCUMENTEVENT_XPS_ADDFIXEDPAGEPRINTTICKETPRE pvOut동일한 포인터입니다.

드라이버는 pvIn을 해제해야 합니다.

DOCUMENTEVENT_XPS_CANCELJOB
pvIn은 NULL입니다.

cbOut
iEsc 매개 변수에 DOCUMENTEVENT_QUERYFILTER 포함된 경우 WPF 인쇄 지원은 pvOut 매개 변수가 cbOut 매개 변수에서 참조하는 버퍼의 크기를 제공합니다. iEsc다른 모든 값의 경우 cbOut은 사용되지 않습니다.

pvOut
WPF 인쇄 지원에서 제공하는 버퍼에 대한 포인터입니다. 버퍼 크기 및 콘텐츠는 iEsc 매개 변수의 값에 따라 달라집니다. 다음 목록에서는 각 iEsc 값에 대한 pvOut 버퍼의 내용을 설명합니다.

DOCUMENTEVENT_QUERYFILTER
DOCEVENT_FILTER 구조체를 포함하는 버퍼에 대한 호출자 제공 포인터입니다.

DOCUMENTEVENT_XPS_ADDFIXEDDOCUMENTSEQUENCEPRINTTICKETPRE
EPrintPropertyType::kPropertyTypeBuffer 형식의 "PrintTicket" 속성을 포함하는 PrintPropertiesCollection 구조체(Winspool.h 참조)에 대한 포인터입니다. 이 속성은 항상 존재합니다. PrintTicket을 사용할 수 없는 경우 PrintPropertyValue.propertyBlob.pBuf의 값은 NULL입니다.

이 속성에는 XML PrintTicket가 포함되어 있으며, 이 경우 WPF(Microsoft Windows Presentation Foundation)는 XPSDocumentWriter 호출자가 제공하는 것 대신 PrintTicket를 사용합니다. (pvOut이 NULL이거나 속성이 없거나 속성 데이터가 NULL인 경우 WPF는 호출자 제공 PrintTicket를 사용합니다.)

이 이벤트가 처리된 후 WPF는 드라이버가 pvOut을 해제할 DOCUMENTEVENT_XPS_ADDFIXEDDOCUMENTSEQUENCEPRINTTICKETPOST 있는 DocumentEvent를 호출합니다.

DOCUMENTEVENT_XPS_ADDFIXEDDOCUMENTSEQUENCEPRINTTICKETPOS
NULL

DOCUMENTEVENT_XPS_ADDFIXEDDOCUMENTPRINTTICKETPRE
EPrintPropertyType::P ropertyTypeBuffer 형식의 "PrintTicket" 속성을 포함하는 PrintPropertiesCollection 구조체(Winspool.h 참조)에 대한 포인터입니다. 이 속성은 항상 존재합니다. PrintTicket을 사용할 수 없는 경우 PrintPropertyValue.propertyBlob.pBuf값은 NULL입니다.

이 속성에는 XML PrintTicket가 포함되며, WPF는 XPSDocumentWriter 호출자가 제공하는 대신 PrintTicket를 사용합니다. (pvOut이 NULL이거나 속성이 없거나 속성 데이터가 NULL인 경우 WPF는 호출자 제공 PrintTicket를 사용합니다.)

이 이벤트가 처리되면 WPF는 드라이버가 pvOut을 해제할 DOCUMENTEVENT_XPS_ADDFIXEDDOCUMENTPRINTTICKETPOST DocumentEvent를 호출합니다.

DOCUMENTEVENT_XPS_ADDFIXEDDOCUMENTPRINTTICKETPOS
NULL

DOCUMENTEVENT_XPS_ADDFIXEDPAGEPRINTTICKETPRE
EPrintPropertyType:: PropertyTypeBuffer 형식의 "PrintTicket" 속성을 포함하는 PrintPropertiesCollection 구조체(Winspool.h 참조)에 대한 포인터입니다. 이 속성은 항상 존재합니다. PrintTicket을 사용할 수 없는 경우 PrintPropertyValue.propertyBlob.pBuf값은 NULL입니다.

이 속성에는 XML PrintTicket가 포함되며, WPF는 XPSDocumentWriter 호출자가 제공하는 대신 PrintTicket를 사용합니다. (pvOut이 NULL이거나 속성이 없거나 속성 데이터가 NULL인 경우 WPF는 호출자 제공 PrintTicket를 사용합니다.)

이 이벤트가 처리되면 WPF는 드라이버가 pvOut을 해제할 DOCUMENTEVENT_XPS_ADDFIXEDPAGEPRINTTICKETPOST DocumentEvent를 호출합니다.

DOCUMENTEVENT_XPS_ADDFIXEDPAGEPRINTTICKETPOS
NULL

반환 값

DrvDocumentEvent 는 다음 값 중 하나를 반환합니다.

DOCUMENTEVENT_SUCCESS
드라이버가 iEsc에서 식별한 이스케이프 코드를 성공적으로 처리했습니다.

DOCUMENTEVENT_FAILURE
드라이버는 iEsc에서 식별한 이스케이프 코드를 지원하지만 오류가 발생했습니다.

DOCUMENTEVENT_UNSUPPORTED
드라이버는 iEsc에서 식별한 이스케이프 코드를 지원하지 않습니다.

XPS 문서 이벤트 구조 및 이벤트 코드 값

다음 코드 예제에서는 새 XPS 문서 이벤트가 사용하는 구조 및 상수입니다.

//
// structures used in XPS Document events
//
 
typedef enum
    {
        kPropertyTypeString = 1,
        kPropertyTypeInt32,
        kPropertyTypeInt64,
        kPropertyTypeByte,
        kPropertyTypeTime,
        kPropertyTypeDevMode,
        kPropertyTypeSD,
        kPropertyTypeNotificationReply,
        kPropertyTypeNotificationOptions,

    } EPrintPropertyType;

    typedef struct
    {
        EPrintPropertyType       ePropertyType;
        union
        {
            BYTE                 propertyByte;
            PWSTR                propertyString;
            LONG                 propertyInt32;
            LONGLONG             propertyInt64;
            struct {
                DWORD  cbBuf;
                LPVOID pBuf;
            }                    propertyBlob;
        } value;

    }PrintPropertyValue;

    typedef struct
    {
        WCHAR*                  propertyName;
        PrintPropertyValue      propertyValue;

    }PrintNamedProperty;

    typedef struct
    {
        ULONG                   numberOfProperties;
        PrintNamedProperty*     propertiesCollection;

    }PrintPropertiesCollection;

이전 코드 예제의 구조체는 Winspool.h에 정의되어 있습니다.

다음 이스케이프 코드는 Winddiui.h에 정의되어 있습니다.

//
 // Escape code for XPS Document events
//
#define DOCUMENTEVENT_QUERYFILTER                                     14
#define DOCUMENTEVENT_XPS_ADDFIXEDDOCUMENTSEQUENCEPRE                 1
// DOCUMENTEVENT_XPS_ADDFIXEDDOCUMENTSEQUENCEPRE must have same value as //DOCUMENTEVENT_CREATEDCPRE for Winspool.drv to query the driver for supported events and reset the cached events.
#define DOCUMENTEVENT_XPS_ADDFIXEDDOCUMENTPRE                         2
#define DOCUMENTEVENT_XPS_ADDFIXEDPAGEPRE        3                           
#define DOCUMENTEVENT_XPS_ADDFIXEDPAGEPOST                            4
#define DOCUMENTEVENT_XPS_ADDFIXEDDOCUMENTPOST                        5
#define DOCUMENTEVENT_XPS_ADDFIXEDDOCUMENTSEQUENCEPOST                13
// DOCUMENTEVENT_XPS_ADDFIXEDDOCUMENTSEQUENCEPOST must have same value as //DOCUMENTEVENT_STARTDOCPOST for Winspool.drv to signal the tray balloon that //the document is completed
#define DOCUMENTEVENT_XPS_CANCELJOB                                   6
#define DOCUMENTEVENT_XPS_ADDFIXEDDOCUMENTSEQUENCEPRINTTICKETPRE      7
#define DOCUMENTEVENT_XPS_ADDFIXEDDOCUMENTPRINTTICKETPRE              8
#define DOCUMENTEVENT_XPS_ADDFIXEDPAGEPRINTTICKETPRE                  9
#define DOCUMENTEVENT_XPS_ADDFIXEDPAGEPRINTTICKETPOST                 10
#define DOCUMENTEVENT_XPS_ADDFIXEDDOCUMENTPRINTTICKETPOST             11
#define DOCUMENTEVENT_XPS_ADDFIXEDDOCUMENTSEQUENCEPRINTTICKETPOST     12