XPS ドライバー ドキュメント イベント
重要
Windows でプリンターとの通信手段として推奨されるのは、最新の印刷プラットフォームです。 プリンターデバイス開発におけるWindows 10および11での印刷体験をカスタマイズするために、MicrosoftのIPPインボックスクラスドライバーとPrint Support Apps (PSA)の使用を推奨します。
詳細については、最新の印刷プラットフォームに関する記事および「印刷サポート アプリの設計ガイド」を参照してください。
Microsoft Windows Presentation Foundation (WPF) 印刷サポートは、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 は、PrintTicket を FixedDocumentSequence (ジョブ レベル) に追加しようとしています。
DOCUMENTEVENT_XPS_ADDFIXEDDOCUMENTSEQUENCEPRINTTICKETPOST
WPF は、対応する DOCUMENTEVENT_XPS_ADDFIXEDDOCUMENT Standard Edition QUENCEPRINTTICKETPRE イベントでドライバーが返すデータを解放する必要があります。
DOCUMENTEVENT_XPS_ADDFIXEDDOCUMENTPRINTTICKETPRE
WPF は、FixedDocument (ドキュメント レベル) に PrintTicket を追加します。
DOCUMENTEVENT_XPS_ADDFIXEDDOCUMENTPRINTTICKETPOST
WPF は、対応する DOCUMENTEVENT_XPS_ADDFIXEDDOCUMENTPRINTTICKETPRE イベントでドライバーが返すデータを解放する必要があります。
DOCUMENTEVENT_XPS_ADDFIXEDPAGEPRINTTICKETPRE
WPF は、PrintTicket を FixedPage (ページ レベル) に追加しようとしています。
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 は 、(DOCUMENTEVENT_QUERYFILTERの場合と同じ) PDOCEVENT_FILTER構造体を指します。
DOCUMENTEVENT_XPS_ADDFIXEDDOCUMENTSEQUENCEPRE
pvIn は 、次の 3 つのプロパティを含む PrintPropertiesCollection 構造体 (Winspool.h を参照) を指します。
EPrintPropertyType::kPropertyTypeInt32 (ULONG) 値である EscapeCode。 EscapeCode はイベント値です。
EPrintPropertyType::kPropertyTypeInt32 (ULONG) 値である JobIdentifier。 JobIdentifier は、GetJob() と SetJob() を呼び出すために必要な ID です。
JobName は EPrintPropertyType::kPropertyTypeString (UNICODE) 値です。
DOCUMENTEVENT_XPS_ADDFIXEDDOCUMENTSEQUENCEPOST
DOCUMENTEVENT_XPS_ADDFIXEDDOCUMENTSEQUENCEPREの場合と同じです。
DOCUMENTEVENT_XPS_ADDFIXEDDOCUMENTPRE
pvIn は は、次の 2 つのプロパティを含む PrintPropertiesCollection 構造体 (Winspool.h を参照) を指します。
EscapeCode は EPrintPropertyType::kPropertyTypeInt32 (ULONG) 値です。 EscapeCode はイベント値です。
DocumentNumber。EPrintPropertyType::kPropertyTypeInt32 (ULONG) 値です。
DOCUMENTEVENT_XPS_ADDFIXEDDOCUMENTPOST
DOCUMENTEVENT_XPS_ADDFIXEDDOCUMENTPREの場合と同じです。
DOCUMENTEVENT_XPS_ADDFIXEDPAGEPRE
pvIn は は、次の 2 つのプロパティを含む PrintPropertiesCollection 構造体 (Winspool.h を参照) を指します。
EscapeCode は EPrintPropertyType::kPropertyTypeInt32 (ULONG) 値です。
PageNumber は EPrintPropertyType::kPropertyTypeInt32 (ULONG) 値です。
DOCUMENTEVENT_XPS_ADDFIXEDPAGEPOST
DOCUMENTEVENT_XPS_ADDFIXEDPAGEPREの場合と同じです。
DOCUMENTEVENT_XPS_ADDFIXEDDOCUMENTSEQUENCEPRINTTICKETPRE
pvIn は は、次の 4 つのプロパティを含む PrintPropertiesCollection 構造体 (Winspool.h を参照) を指します。
EPrintPropertyType::kPropertyTypeInt32 (ULONG) である EscapeCode。 EscapeCode はイベント値です。
EPrintPropertyType::kPropertyTypeInt32 (ULONG) 値である JobIdentifier。
JobName は EPrintPropertyType::kPropertyTypeString (UNICODE) 値です。
PrintTicket。これは EPrintPropertyType:: kPropertyTypeByte 値です。
PrintPropertiesCollection 構造体とそのプロパティを "PRE" イベントに割り当て、対応する "POST" イベントで解放する必要があります。 pvOut を NULL に設定すると、イベントをサポートしているが、特定のドキュメントまたはページの PrintTicket を変更する必要はないことを示すことができます。 プラグインは、"PRE" イベントと "POST" イベントの間でアンロードしないでください。
DOCUMENTEVENT_XPS_ADDFIXEDDOCUMENTSEQUENCEPRINTTICKETPOS
pvIn は、DOCUMENTEVENT_XPS_ADDFIXEDDOCUMENT Standard Edition QUENCEPRINTTICKETPRE からの pvOut と同じポインターです
ドライバーは pvIn を解放する必要があります。
DOCUMENTEVENT_XPS_ADDFIXEDDOCUMENTPRINTTICKETPRE
pvIn は 、次の 3 つのプロパティを含む PrintPropertiesCollection 構造体 (Winspool.h を参照) を指します。
EscapeCode は EPrintPropertyType::kPropertyTypeInt32 (ULONG) 値です。 EscapeCode はイベント値です。
DocumentNumber。EPrintPropertyType::kPropertyTypeInt32 (ULONG) 値です。
PrintTicket。これは EPrintPropertyType:: kPropertyTypeByte 値です。
PrintPropertiesCollection 構造体とそのプロパティを "PRE" イベントに割り当て、対応する "POST" イベントで解放する必要があります。 pvOut を NULL に設定すると、イベントをサポートしているが、特定のドキュメントまたはページの PrintTicket を変更する必要はないことを示すことができます。 プラグインは、"PRE" イベントと "POST" イベントの間でアンロードしないでください。
DOCUMENTEVENT_XPS_ADDFIXEDDOCUMENTPRINTTICKETPOS
pvIn は、DOCUMENTEVENT_XPS_ADDFIXEDDOCUMENTPRINTTICKETPRE の pvOut と同じポインターです。
ドライバーは pvIn を解放する必要があります。
DOCUMENTEVENT_XPS_ADDFIXEDPAGEPRINTTICKETPRE
pvIn は 、次の 3 つのプロパティを含む PrintPropertiesCollection 構造体 (Winspool.h を参照) を指します。
EscapeCode は EPrintPropertyType::kPropertyTypeInt32 (ULONG) 値です。 EscapeCode はイベント値です。
PageNumber は EPrintPropertyType::kPropertyTypeInt32 (ULONG) 値です。
PrintTicket。これは EPrintPropertyType:: kPropertyTypeByte 値です。
PrintPropertiesCollection 構造体とそのプロパティを "PRE" イベントに割り当て、対応する "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 印刷サポートは、cbOut パラメーターで pvOut パラメーターが参照するバッファーのサイズを提供します。 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 が含まれています。この XML PrintTicket は、MICROSOFT Windows Presentation Foundation (WPF) が XPSDocumentWriter 呼び出し元が提供するツールの代わりに PrintTicket を使用します。 (pvOut が NULL であるか、プロパティが存在しないか、プロパティ データが NULL の場合、WPF は呼び出し元から提供された PrintTicket を使用します)。
このイベントが処理されると、WPF はドライバーが pvOut を解放するために、DOCUMENTEVENT_XPS_ADDFIXEDDOCUMENT Standard Edition QUENCEPRINTTICKETPOST を使用して 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::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_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