Vista以降の新しいFileOpenダイアログのフック

[戻る]
Takashi 2010/01/21(木) 10:11:39
お世話になっております。

VisualStudio 2005 Pro + MFC
の環境でC++によるWindowsアプリの開発を行っています。

WinVistaで新しいルックスのFileOpenダイアログが導入され、
遅ればせながら自作のアプリにも導入しようと思ったのですが、
以下のような現象が起きています。

MFCのCFileDialogクラスをそのまま使うとXPスタイルのダイアログに
なってしまうので、GetOpenFileName()などのAPIを使用して新しい
ダイアログを表示しています。

ここまではいいのですが、このダイアログにフックを追加すると、
XPスタイルの表示に戻ってしまいます。

フック関連の部分だけを抜き出すと、、、

OPENFILENAME ofn;

ofn.Flags |= (OFN_ENABLEHOOK | OFN_EXPLORER);
ofn.lpfnHook = OFNHookProc;

----------------------------------------

UINT_PTR CALLBACK OFNHookProc(HWND hdlg, UINT uiMsg, WPARAM wParam, LPARAM 
lParam)
{
    LPOFNOTIFY lpOfNotify;

    switch(uiMsg){
        case WM_INITDIALOG:
            return TRUE;

        case WM_NOTIFY:
            lpOfNotify = (LPOFNOTIFY) lParam;
            if (lpOfNotify->hdr.code == CDN_FILEOK) {
                AfxMessageBox(L"テストメッセージ");
            }
            break;
    }
    
    return 0;
}

おそらく、MFCのCFileDialogクラスもフックを使用しているので、
XPスタイルになってしまうのだと想像していますが、
Vistaスタイルのダイアログでフックを有効にする方法というのは
あるのでしょうか?

フックでやりたいことは、選択されたファイル名の検証だけです。
よろしくお願い致します。

subaru 2010/01/21(木) 10:57:52
Vista以降だとGetOpenFileName/GetSaveFileNameから
IFileDialog(IFileOpenDialog/IFileSaveDialog)に
リダイレクトされるようになっていると思います。

IFileDialogで直接操作するように変更して
IFileDialog::AdviseでIFileDialogEventsを
渡してやればハンドリングできそうな感じです。

XP以前でも動作させるならOS判定して
処理を切り替える手間が増えてしまいますどね。

ITO 2010/01/21(木) 11:06:54
> VisualStudio 2005 Pro + MFC
開発環境を拝見すると、Vistaは対応してないですね。
まぁー、動作はする可能性はありますが、マイクロソフトは保障していません。

> ここまではいいのですが、このダイアログにフックを追加すると、
> XPスタイルの表示に戻ってしまいます。
VisualStudio 2005のMFCがvistaのスタイルに完全対応していない可能性が高いですね。

VisualStudio 2008以降を購入して再検討するか、FremeWorkで作り変えるかですね。
VisualStudio 2010を購入する方がいいかもしれません。

Takashi 2010/01/21(木) 13:57:46
[[解決]]
subaru さん、ITO さん、アドバイスありがとうございました。

IFileDialogというCOMインターフェースがあったんですね。
知りませんでした。
ネットで調べたら、サンプルソースなども見つかりました。

かなり複雑そうですが、VS2005でも使えるかどうか調べてみたいと思います。
ありがとうございました。

古いスレッドには追加発言できません。