Vista以降の新しいFileOpenダイアログのフック – プログラミング – Home

Vista以降の新しいFileOpen...
 
通知
すべてクリア

[解決済] Vista以降の新しいFileOpenダイアログのフック


Takashi
 Takashi
(@Takashi)
ゲスト
結合: 22年前
投稿: 8
Topic starter  

お世話になっております。

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
 subaru
(@subaru)
ゲスト
結合: 19年前
投稿: 381
 

Vista以降だとGetOpenFileName/GetSaveFileNameから
IFileDialog(IFileOpenDialog/IFileSaveDialog)に
リダイレクトされるようになっていると思います。

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

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


返信引用
ITO
 ITO
(@ITO)
ゲスト
結合: 22年前
投稿: 1235
 

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

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

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


返信引用
Takashi
 Takashi
(@Takashi)
ゲスト
結合: 22年前
投稿: 8
Topic starter  

subaru さん、ITO さん、アドバイスありがとうございました。

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

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


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました