Win32 API 日本語リファレンス
ホームUI.Shell › IPreviewHandler

IPreviewHandler

COM
IID8895b1c6-b41f-4c1c-a562-0d564250836f継承元IUnknown自前メソッド開始 vtbl3

公式ドキュメント

リッチプレビューを表示するためのメソッドを公開します。

解説(Remarks)

プレビューハンドラーはマネージドコードで作成できます。通常、すべてのプレビューハンドラーは prevhost.exe と呼ばれるサロゲートプロセス内でまとめてホストされます。このプロセスには、通常の整合性レベルで実行されるプレビューハンドラー用のインスタンスと、低整合性レベルで実行されるプレビューハンドラー用のインスタンスの 2 つがあります。ハンドラーをマネージドコードで実装する場合、そのハンドラーはこれら共有プロセスのいずれの内部でも実行すべきではありません。代わりに、レジストリに新しい AppID エントリを作成し(DllSurrogate 値として prevhost.exe を指定)、それをハンドラーのクラス ID のレジストリ値内の AppID 値として設定することで、ハンドラーが prevhost.exe の新しいインスタンスを取得するようにしてください。これにより、他のハンドラーが使用する共通インスタンスではなく、ハンドラー専用の一意の prevhost.exe インスタンスが作成されます。

メソッド 7

vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。

vtbl 3 HRESULT SetWindow(HWND hwnd, RECT* prc)

プレビューウィンドウの親ウィンドウ、および親ウィンドウ内でプレビューウィンドウに使用する領域を設定します。

hwndHWNDin親ウィンドウへのハンドル。
prcRECT*inプレビューに使用する領域を定義する RECT へのポインター。

戻り値

型: HRESULT

このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。

解説(Remarks)

プレビューハンドラーは、prc で定義された領域全体の描画を担当します。プレビューウィンドウが既に作成されている場合、プレビューハンドラーはそのプレビューウィンドウを新しい親 hwnd に関連付け、prc で定義された領域にサイズ変更する必要があります。プレビューウィンドウがまだ作成されていない場合、プレビューハンドラーは、IPreviewHandler::DoPreview でプレビューウィンドウが作成されるときのためにこの情報を保持しておく必要があります。

メモ この情報は IPreviewHandler::DoPreview を呼び出す前に格納しておくことが推奨されます。そうすることで、プレビューが開始されない場合のセットアップ時のパフォーマンスが向上します。
vtbl 4 HRESULT SetRect(RECT* prc)

親 hwnd 内でプレビューハンドラーが描画する領域を変更するようプレビューハンドラーに指示します。

prcRECT*inプレビューに使用する RECT へのポインター。

戻り値

型: HRESULT

このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。

解説(Remarks)

プレビューハンドラーウィンドウが作成される前に呼び出された場合、新しい RECT は、以前の IPreviewHandler::SetWindow 呼び出しで受け取った RECT を置き換えます。

プレビューハンドラーウィンドウが作成された後に呼び出された場合、プレビューハンドラーウィンドウをサイズ変更する必要があります。

プレビューハンドラーが既にレンダリング中の場合、レンダリング処理を中断せずにプレビューをサイズ変更する必要があります。

vtbl 5 HRESULT DoPreview()

以前の Initialize メソッド呼び出しで指定されたソースからデータを読み込み、プレビューウィンドウへのレンダリングを開始するようプレビューハンドラーに指示します。

戻り値

型: HRESULT

このメソッドは次のいずれかの値を返すことがあります。

戻り値 説明
S_OK
操作は正常に完了しました。
E_PREVIEWHANDLER_DRM_FAIL
デジタル著作権管理によってブロックされました。
E_PREVIEWHANDLER_NOAUTH
ファイルのアクセス許可によってブロックされました。
E_PREVIEWHANDLER_NOTFOUND
項目が見つかりませんでした。
E_PREVIEWHANDLER_CORRUPT
項目が破損していました。

解説(Remarks)

プレビューウィンドウがまだ作成されていない場合、このメソッドが呼び出された後に作成する必要があります。プレビューハンドラーは、IPreviewHandler::SetWindow または IPreviewHandler::SetRect で指定された領域の描画を担当します。これらのメソッドがプレビューハンドラーのレンダリング中に呼び出された場合、項目のレンダリングを停止したり再開したりせずに、ウィンドウの親の変更やサイズ変更を行う必要があります。

このメソッドは、IPreviewHandler::SetWindow が呼び出された後にのみ呼び出す必要があります。

さらに、このメソッドは、IInitializeWithItem::InitializeIInitializeWithStream::Initialize、または IInitializeWithFile::Initialize が呼び出された後にのみ呼び出す必要があります。

メモ このメソッドが呼び出されるまで、実際にプレビューウィンドウを作成しないでください。
vtbl 6 HRESULT Unload()

プレビューのレンダリングを停止し、初期化時に渡された項目に基づいて割り当てられたすべてのリソースを解放するようプレビューハンドラーに指示します。

戻り値

型: HRESULT

このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。

解説(Remarks)

呼び出されると、プレビューウィンドウが破棄されます。

このメソッドは、IInitializeWithItem::InitializeIInitializeWithStream::Initialize、または IInitializeWithFile::Initialize が呼び出された後にのみ呼び出す必要があります。この初期化に関連付けられたすべてのリソースが解放されます。IPreviewHandler::DoPreview を呼び出す前に、このプレビューハンドラーは、いずれかの初期化インターフェイスの呼び出しと IPreviewHandler::SetWindow の呼び出しによって再初期化されます。

vtbl 7 HRESULT SetFocus()

プレビューハンドラーに、自身にフォーカスを設定するよう指示します。

戻り値

型: HRESULT

このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。

解説(Remarks)

このメソッドは、最初のタブストップにフォーカスを設定するか、最後のタブストップにフォーカスを設定するかを決定するために、SHIFT キーの状態を照会する必要があります。これは、IPreviewHandler::SetFocus が、呼び出し元スレッドによって作成されたウィンドウにフォーカスが設定される場合にのみ成功できるために必要です。

これは、ホストからプレビューハンドラーへ渡されるアクセラレータキーの範囲のすべてであり、他のアクセラレータは渡されません。IPreviewHandler::TranslateAccelerator は、プレビューハンドラーのメッセージポンプから IPreviewHandler オブジェクトへのメッセージにのみ使用されます。

vtbl 8 HRESULT QueryFocus(HWND* phwnd)

GetFocus 関数の呼び出しから得られる HWND を返すようプレビューハンドラーに指示します。

phwndHWND*outこのメソッドが返るとき、プレビューハンドラーのフォアグラウンドスレッドから GetFocus 関数を呼び出して返された HWND へのポインターが格納されます。

戻り値

型: HRESULT

このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。

解説(Remarks)

このメソッドは、GetFocus 関数が、呼び出し元スレッドによって作成されたウィンドウにフォーカスがある場合にのみ成功できるために必要です。このメソッドは、タブ順序を管理し、プレビューハンドラーのウィンドウへのタブ移動およびウィンドウからのタブ移動をサポートするためにホストによって使用されます。

vtbl 9 HRESULT TranslateAccelerator(MSG* pmsg)

プレビューハンドラーが実行されているプロセスのメッセージポンプから渡されたキーストロークを処理するようプレビューハンドラーに指示します。

pmsgMSG*inウィンドウメッセージへのポインター。

戻り値

型: HRESULT

キーストロークメッセージがプレビューハンドラーによって処理できる場合、ハンドラーはそれを処理して S_OK を返します。プレビューハンドラーがキーストロークメッセージを処理できない場合、TranslateAccelerator を使用してホストに提供します。ホストがメッセージを処理した場合、このメソッドは S_OK を返します。ホストがメッセージを処理しない場合、このメソッドは S_FALSE を返します。

解説(Remarks)

この関数は、プレビューハンドラーが実行されているプロセスのメッセージポンプからのみ呼び出されます。この関数により、TranslateAccelerator を使用して、メッセージポンプからホストへキーストロークメッセージを転送できます。

プレビューハンドラーは、そのメッセージポンプからメッセージ(キーストローク)を受け取ると、それをホストへ転送する責任があります。

プレビューハンドラーに対して IObjectWithSite::SetSite が呼び出されると、プレビューハンドラーのホストへの参照が渡されます。オブジェクトは直ちにそのサイトに対して IPreviewHandlerFrameQueryInterface し、そのポインターを格納する必要があります。

その後、プレビューハンドラーは、キーストロークをフィルタリングするためのアクセラレータテーブルを取得するために GetWindowContext を呼び出すオプションがあります。その後、プレビューは IsAccelerator を使用してキーストロークをそのアクセラレータテーブルと比較し、一致するキーストロークについてのみ IPreviewHandler::TranslateAccelerator を呼び出すことができます。これにより、パフォーマンスがわずかに向上する場合があります。プレビューハンドラーは、DestroyAcceleratorTable 関数を使用してアクセラレータテーブルを解放する必要があります。

プレビューハンドラーがテーブルをまったく使用せず、すべてのキーストロークに対して IPreviewHandler::TranslateAccelerator を呼び出すことも許容されます。低整合性プロセスで実行されるすべてのプレビューハンドラーは、この方法を使用する必要があることに注意してください。

タブキーが押されたとき、プレビューハンドラーに複数のタブストップがある場合、それらのタブストップ内でキーボードフォーカスを移動させる責任があります。現在のキーボードフォーカスがこれらのタブストップの 1 つにあり、キーボードフォーカスを進めると別のプレビューアのタブストップに移動する場合、プレビューアは次のタブストップに対して SetFocus を呼び出す必要があります。それ以外の場合、タブキーはホストに転送され、プレビューアからのタブ移動を処理させる必要があります。

出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)

HSP用 COM定義

#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"

出力引数:
#define global IID_IPreviewHandler "{8895B1C6-B41F-4C1C-A562-0D564250836F}"
#usecom global IPreviewHandler IID_IPreviewHandler "{}"
#comfunc global IPreviewHandler_SetWindow             3 sptr,var
#comfunc global IPreviewHandler_SetRect               4 var
#comfunc global IPreviewHandler_DoPreview             5
#comfunc global IPreviewHandler_Unload                6
#comfunc global IPreviewHandler_SetFocus              7
#comfunc global IPreviewHandler_QueryFocus            8 sptr
#comfunc global IPreviewHandler_TranslateAccelerator  9 var
; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。
; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。
; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。
; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。