none
SHBrowseForFolderでOKボタンをクリックした後、SHBrowseForFolderに戻る方法は? RRS feed

  • 質問

  • SHBrowseForFolderで新規にフォルダを作成した後、ツリー内でそのフォルダ名を書き換えた場合、
    そのフォルダ名に許可しない文字が含まれていたら、SHBrowseForFolderでOKしてもダイアログを終了出来ないようにしたいのですが、
    それは可能でしょうか。

    コールバック関数でBFFM_SELCHANGEDの場合文字列をチェックしてエラーの場合return 1を設定してみましたが、
    そのまま処理が進んでしまっているようです。

    よろしくお願い致します。
    2009年5月29日 0:56

回答

  • 戻り値が有効なのは BFFM_VALIDATEFAILED だけで、それ以外は 0 を返すものみたいですね。

    オンラインの

     BrowseCallbackProc Function ()
     http://msdn.microsoft.com/en-us/library/bb762598.aspx

    だと不思議と Return Value の説明が抜けているようですが、Visual Studio 2008 のドキュメントには、

     Returns zero except in the case of BFFM_VALIDATEFAILED. For that flag, returns zero to dismiss the dialog or nonzero to keep the dialog displayed.

    と書かれています。

     BrowseCallbackProc Function
     ms-help://MS.VSCC.v90/MS.MSDNQTR.v90.ja/shellcc/platform/shell/reference/callbackfunctions/browsecallbackproc.htm

    その代わりといってはなんですが、無効なフォルダ名のときに BFFM_ENABLEOK を SendMessage して、
    OK ボタンを Disable にするというのはいかがでしょうか?
    2009年5月29日 1:51
  • サブクラス化をすると、OK ボタンのクリックを捕まえられます。

    BrowseCallbackProc の BFFM_INITIALIZED メッセージのときに、

    SetWindowLong(hwnd, GWL_WNDPROC, (LONG)MyWndProc);

    として、サブクラス化します。次に MyWndProc の方では、

    long __stdcall MyWndProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
    {
        switch(uMsg)
        {
        case WM_COMMAND:
            if(LOWORD(wParam) == IDOK)
            {
                // OK ボタンをキャンセルしたい場合は 0 を返します
                return 0;
            }
            break;
        }
        return DefDlgProc(hwnd, uMsg, wParam, lParam);
    }

    などとしておけば、OK ボタンのクリックを捕まえられます。
    ここで何らかのチェックを実行し、0 を返すと OK を取り消しできます。
    • 編集済み totojo 2009年5月29日 7:42
    • 回答としてマーク 高橋 春樹 2009年6月10日 8:32
    2009年5月29日 7:41

すべての返信

  • 戻り値が有効なのは BFFM_VALIDATEFAILED だけで、それ以外は 0 を返すものみたいですね。

    オンラインの

     BrowseCallbackProc Function ()
     http://msdn.microsoft.com/en-us/library/bb762598.aspx

    だと不思議と Return Value の説明が抜けているようですが、Visual Studio 2008 のドキュメントには、

     Returns zero except in the case of BFFM_VALIDATEFAILED. For that flag, returns zero to dismiss the dialog or nonzero to keep the dialog displayed.

    と書かれています。

     BrowseCallbackProc Function
     ms-help://MS.VSCC.v90/MS.MSDNQTR.v90.ja/shellcc/platform/shell/reference/callbackfunctions/browsecallbackproc.htm

    その代わりといってはなんですが、無効なフォルダ名のときに BFFM_ENABLEOK を SendMessage して、
    OK ボタンを Disable にするというのはいかがでしょうか?
    2009年5月29日 1:51
  • totojoさん、回答ありがとうございました。

    >その代わりといってはなんですが、無効なフォルダ名のときに BFFM_ENABLEOK を SendMessage して、
    >OK ボタンを Disable にするというのはいかがでしょうか?

    私もその後色々試してみて、上記の方法を発見しました。
    ただ、上記の方法は、ツリーでフォルダを新規に作成した時とフォルダ選択を変更したときに有効で、
    OKボタンを押してしまったら、ダイアログは終了してしまうので、
    呼び出し側でチェック後、だめだったら、選択したフォルダをカレントに指定してダイアログを表示しなおす・・・
    とかしないとだめなんでしょうね。

    ご教授ありがとうございました。
    2009年5月29日 3:35
  • サブクラス化をすると、OK ボタンのクリックを捕まえられます。

    BrowseCallbackProc の BFFM_INITIALIZED メッセージのときに、

    SetWindowLong(hwnd, GWL_WNDPROC, (LONG)MyWndProc);

    として、サブクラス化します。次に MyWndProc の方では、

    long __stdcall MyWndProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
    {
        switch(uMsg)
        {
        case WM_COMMAND:
            if(LOWORD(wParam) == IDOK)
            {
                // OK ボタンをキャンセルしたい場合は 0 を返します
                return 0;
            }
            break;
        }
        return DefDlgProc(hwnd, uMsg, wParam, lParam);
    }

    などとしておけば、OK ボタンのクリックを捕まえられます。
    ここで何らかのチェックを実行し、0 を返すと OK を取り消しできます。
    • 編集済み totojo 2009年5月29日 7:42
    • 回答としてマーク 高橋 春樹 2009年6月10日 8:32
    2009年5月29日 7:41
  • こんにちは、フォーラムオペレータの高橋春樹です。

    totojoさん、いつもお世話になっております。
    アドバイス有難うございました。

    msdn.bambinoさん、はじめまして。
    MSDNフォーラムのご利用ありがとうございます。

    totojoさんから、新たなアドバイスがあったと思うのですが、
    試して頂けましたでしょうか?(^-^)

    totojoさんから頂いた情報を皆様と共有するために、
    回答マークを付けさせてもらいました。
    不適切な場合は、回答マークを削除することも可能です。

    今後ともMSDNフォーラムをよろしくお願いします。


    マイクロソフト株式会社 フォーラム オペレータ 高橋春樹
    2009年6月10日 8:32