LPOFNHOOKPROC
コールバックシグネチャ
UINT_PTR LPOFNHOOKPROC(
HWND param0,
DWORD param1,
WPARAM param2,
LPARAM param3
);パラメーター
| フィールド | 型 |
|---|---|
| param0 | HWND |
| param1 | DWORD |
| param2 | WPARAM |
| param3 | LPARAM |
公式ドキュメント
[Windows Vista 以降、Open および Save As コモンダイアログボックスは Common Item Dialog に置き換えられました。Common Dialog Box Library のこれらのダイアログボックスではなく、Common Item Dialog API を使用することを推奨します。]
ダイアログボックスから送信される通知メッセージを受け取ります。この関数は、子ダイアログテンプレートを指定して定義した追加のコントロールに対するメッセージも受け取ります。OFNHookProc フックプロシージャは、エクスプローラースタイルの Open および Save As ダイアログボックスで使用される、アプリケーション定義またはライブラリ定義のコールバック関数です。
LPOFNHOOKPROC 型は、このコールバック関数へのポインターを定義します。OFNHookProc は、アプリケーション定義の関数名のプレースホルダーです。
戻り値
フックプロシージャが 0 を返した場合、既定のダイアログボックスプロシージャがそのメッセージを処理します。
フックプロシージャが 0 以外の値を返した場合、既定のダイアログボックスプロシージャはそのメッセージを無視します。
CDN_SHAREVIOLATION および CDN_FILEOK 通知メッセージについては、フックプロシージャは SetWindowLong 関数を使用して 0 以外の DWL_MSGRESULT 値を設定したことを示すために、0 以外の値を返す必要があります。
解説(Remarks)
Open または Save As ダイアログボックスを作成するときに OFN_EXPLORER フラグを指定せず、かつフックプロシージャを使用したい場合は、旧スタイルの OFNHookProcOldStyle フックプロシージャを使用する必要があります。この場合、ダイアログボックスは旧スタイルのユーザーインターフェイスになります。
GetOpenFileName 関数または GetSaveFileName 関数を使用してエクスプローラースタイルの Open または Save As ダイアログボックスを作成する場合、OFNHookProc フックプロシージャを指定できます。フックプロシージャを有効にするには、ダイアログ作成関数に渡した OPENFILENAME 構造体を使用します。lpfnHook メンバーにフックプロシージャへのポインターを指定し、Flags メンバーに OFN_ENABLEHOOK フラグを指定します。
エクスプローラースタイルのコモンダイアログボックスにフックプロシージャを指定すると、システムは既定のダイアログボックスの子となるダイアログボックスを作成します。フックプロシージャは、その子ダイアログのダイアログプロシージャとして機能します。この子ダイアログは OPENFILENAME 構造体で指定したテンプレートに基づきます。テンプレートを指定しなかった場合は、既定の子ダイアログになります。子ダイアログは、既定のダイアログプロシージャが WM_INITDIALOG メッセージを処理しているときに作成されます。子ダイアログが自身の WM_INITDIALOG メッセージを処理した後、既定のダイアログプロシージャは、必要に応じて標準コントロールを移動し、子ダイアログの追加コントロールのための領域を確保します。その後、システムは CDN_INITDONE 通知メッセージをフックプロシージャに送信します。
フックプロシージャは、既定のダイアログボックスの標準コントロールに向けられたメッセージを受け取りません。標準コントロールをサブクラス化することもできますが、アプリケーションが将来のバージョンと互換でなくなる可能性があるため、推奨されません。ただし、エクスプローラースタイルのコモンダイアログボックスは、フックプロシージャがダイアログを監視および制御するために使用できる一連のメッセージを提供します。これには、ダイアログから送信される一連の通知メッセージのほか、ダイアログから情報を取得するために送信できるメッセージが含まれます。これらのメッセージの完全な一覧については、「Explorer-Style Hook Procedures」を参照してください。
フックプロシージャが WM_CTLCOLORDLG メッセージを処理する場合は、ダイアログボックスの背景を描画するための有効なブラシハンドルを返す必要があります。一般に、WM_CTLCOLOR* メッセージを処理する場合は、指定されたコントロールの背景を描画するための有効なブラシハンドルを返す必要があります。
フックプロシージャから EndDialog 関数を呼び出さないでください。代わりに、フックプロシージャは PostMessage 関数を使用して、IDCANCEL 値を伴う WM_COMMAND メッセージをダイアログボックスプロシージャにポストできます。IDCANCEL をポストするとダイアログボックスが閉じ、ダイアログボックス関数は FALSE を返します。フックプロシージャがダイアログボックスを閉じた理由を知る必要がある場合は、フックプロシージャとアプリケーションの間の通信手段を独自に用意する必要があります。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)