7

ここのサンプル プロジェクトから作業しています: http://www.codeproject.com/Articles/8086/Extending-the-save-file-dialog-class-in-NET

上部のアドレス/場所バーを非表示にし、他の変更を加えましたが、親フォルダーに移動できるボタンを無効にすることはできません。Ist は ToolbarWindow32 クラスにあり、これが問題です。これは私が現時点で持っているものですが、機能していません:

int parentFolderWindow = GetDlgItem(parent, 0x440);

//Doesn't work
//ShowWindow((IntPtr)parentFolderWindow, SW_HIDE);

//40961 gathered from Spy++ watching messages when clicking on the control
// doesn't work
//SendMessage(parentFolderWindow, TB_ENABLEBUTTON, 40961, 0);

// doesn't work
//SendMessage(parentFolderWindow, TB_SETSTATE, 40961, 0);

//Comes back as '{static}', am I working with the wrong control maybe?
GetClassName((IntPtr)parentFolderWindow, lpClassName, (int)nLength);

または、親フォルダー ボタンを使用して、私が望まない場所に移動した場合、移動先の新しいディレクトリを見ることができます。ナビゲーションを強制的に戻す方法はありますか?

スクリーンショット

編集:スクリーンショットを追加

4

3 に答える 3

5

// '{static}' として返されます。間違ったコントロールで作業している可能性がありますか?

間違ったコントロールを使用していることはわかっています。「ToolbarWindow32」が返されることを期待していました。Codeproject.com のコードでよくある非常に重大な問題は、このコードが投稿されたとおりに機能しなくなることです。Windows は 2004 年以降、大きく変化しました。Vista はそれ以来、完全に新しいシェル ダイアログのセットを追加した最初のバージョンであり、それらはIFileDialogに基づいています。特に、ダイアログのカスタマイズは、 IFileDialogCustomizeインターフェースを介してよりクリーンになります。実際にやりたいことではなく、カスタマイズにはナビゲーション バーの操作は含まれていません。

IFileDialogEvents インターフェイスはイベントを配信します。探しているのはOnFolderChangingイベントです。ユーザーが現在のフォルダーから離れて移動するのを防ぐように設計されています。これは、本当にやりたいことです。

これは理論上は問題ないように見えますが、これらのインターフェースを実際に使用しようとする場合は注意が必要です。Windows シェルに関連するものに共通する問題は、C++ からのみ簡単に使用できるようにしたことです。COM インターフェイスは、タイプ ライブラリのない IUnknown に基づく「扱いにくい」種類のインターフェイスであり、C# または VB.NET プロジェクトへの参照を簡単に追加できます。Microsoft は、これらのインターフェイスを C# からも使用できるようにする「Vista ブリッジ」を公開しまし。はい、うん。これを 2 回実行する必要があることに気付いた場合は、ダブル yuck を実行します。これは、後の Windows バージョンでのみ機能し、XP でこれを実行しようとしているという強いヒントがあります (見つけたコントロール ID から判断)。

これは単にサポートしたいものではありません。代替手段は非常に単純なので、代わりにサポートされている .NET FileOk イベントを使用してください。Winforms の例:

    private void SaveButton_Click(object sender, EventArgs e) {
        string requiredDir = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
        using (var dlg = new SaveFileDialog()) {
            dlg.InitialDirectory = requiredDir;
            dlg.FileOk += (s, cea) => {
                string selectedDir = System.IO.Path.GetDirectoryName(dlg.FileName);
                if (string.Compare(requiredDir, selectedDir, StringComparison.OrdinalIgnoreCase) != 0) {
                    string msg = string.Format("Sorry, you cannot save to this directory.\r\nPlease select '{0}' instead", requiredDir);
                    MessageBox.Show(msg, "Invalid folder selection");
                    cea.Cancel = true;
                }
            };
            if (dlg.ShowDialog() == DialogResult.OK) {
                // etc...
            }
        }
    }
于 2014-04-30T11:37:45.670 に答える
1

私はこれがうまくいくつもりはありません。ボタンを無効にしても、入力..\して保存をクリックすると、1 レベル上がります。ファイル名のテキスト ボックスを正確に無効にして、ダイアログの機能を維持することはできません。

FolderBrowserDialogを使用してそのRootFolder プロパティを設定し、ユーザーにファイル名を入力するか、自動生成するように求める方がよいでしょう。

ユーザーを制限したいフォルダがそうでない場合は、パスを BROWSEINFO.pidlRoot に渡すためにManually using to get a PIDLIST_ABSOLUTE をEnvironment.SpecialFolder呼び出すためにいくつかの作業を行う必要がありますSHBrowseForFolderILCreateFromPath

FolderBrowserDialog.RunDialogその電話をかける方法を振り返ってみることができます。

于 2014-04-30T10:36:52.427 に答える
1

低レベルのコードを開発する代わりにそのようなカスタム動作が必要なため (次のバージョンの Windows で壊れる可能性があります)、ファイル ピッカー フォームの開発を試みることができます。

基本的にはシンプルなツリービュー+リストビューです。Microsoft にはウォークスルーがあります。

半日かかりますが、カスタム フォームを作成したら、トリックや制限なしで必要なすべての動作を定義できます。

于 2014-05-07T08:15:20.700 に答える