FolderBrowderDialog で Ondriveフォルダーなどを表示する方法

タグの編集
投稿者 N88-Basic  (社会人) 投稿日時 2019/11/19 14:16:50
Windows 10 Home(64) Ver1909 + Visual Studio 2019 + 灰色版Onedrive を利用しています。

この環境で、FolderBrowserDialog にて、Onedrive フォルダーやクイックアクセスを表示させる方法があればご教授ください。
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2019/11/19 16:57:48
FolderBrowserDialog は、XP までの古い API (SHBrowseForFolder) に依存しており、
クイックアクセスの表示には対応していません。

クイックアクセス対応のフォルダー選択ダイアログを開くのであれば、
nuget で Windows API Code Pack を組み込んだ上で、
Microsoft.WindowsAPICodePack.Dialogs.CommonOpenFileDialog クラスを
利用するのが手っ取り早いです。
投稿者 N88-BASIC  (社会人) 投稿日時 2019/11/24 18:50:22
魔界の仮面弁士 さん、ご返答が遅くなり申し訳ございません。

NuGet なるものを使用するのが初めてで色々調べてみたのですが、実現にまでに至りませんでした。

以下の点についてご教授いただければ幸いです。

(1)Visual Studio のメニューの「ツール」->「NuGetパッケージマネージャー(N)」->「ソリューションのNugetパッケージの管理(N)」を選択した場合と、「ソリューションエキスプローラ」から「参照」を右クリックのコンテキストメニュー内の「Nugetパッケージの管理(N)」を選択した場合で、同じ内容のタブ(名称は異なる)が表示されますがどちらからでもいいのでしょうか?

(2)上記タブで”Windows APICodePack”を検索するとかなりの数がヒットします。どれを選べばいいのか選択基準などがあるのでしょうか?

(3)ライセンス表示でも英文で記述で、ライセンスがCUSTOM などで、どのようなものか判断できず苦慮しています。公開や販売の予定はありませんが、自宅のパソコン(複数)、バイト先のパソコン(複数)でも使用したいと思っています。

※FolderBrowserDialog の RootFolder に Environment.SpecialFolder.Desktop をセットしておくととりあえず、Onedrive は表示されました。以前は Environment.SpecialFolder.MyComputer を指定していました。ただ、クイックアクセスなどが表示されないので OpenFileDialog などの場合と比べて不便さを感じています。

以上、よろしくお願いいたします。

投稿者 魔界の仮面弁士  (社会人) 投稿日時 2019/11/25 12:25:09
NuGet パッケージ マネージャーが組み込まれているバージョンの Visual Studio をお使いのようですね。それなら話が早い。(VS2008 等の古いバージョンや、VS 拡張機能が許可されていない環境だと、手動で組み込むなどの手間が発生するところでした)


> エキスプローラ
「エクスプローラー」ですね。


> (1)どちらからでもいいのでしょうか?
はい。どちらからでも同じように操作できます。

ただしソリューション エクスプローラーからの場合、
ソリューション(WindowsApp1.sln)を右クリックした場合と、
プロジェクト(WindowsApp1.vbproj)を右クリックした場合とで、
若干動作が異なりますので御注意ください。

後者は、選択されたプロジェクトのライブラリみが対象となります。

一方前者は、メニューの『ソリューションのNugetパッケージの管理(N)』と同じであり、
現在のソリューション内にあるプロジェクト群すべてに対して、
インストール/アンインストールを個別に選択できます。



> (2)どれを選べばいいのか選択基準などがあるのでしょうか?
Windows API Code Pack は元々、Microsoft によって開発・公開されたライブラリ群です。
https://blogs.msdn.microsoft.com/ttanaka/2010/10/03/windows-api-code-pack-teched2010-1/

その後、配布が終了して保守が行われなくなったため、有志がそれを再公開していますが、
元が同じものなので、基本的に誰が公開しているものでも大きく異なる物ではありません。
https://github.com/aybe/Windows-API-Code-Pack-1.1
https://github.com/devkimchi/Windows-API-Code-Pack-1.1


どれを選べばよいか悩んだ時は、ダウンロード数の多い物から試すとよいとは思いますが、
-Core 、-Shell、-ShellExtensions、-Sensors、-DirectX、-ExtendedLinguisticServices と
機能別に分かれているので、初見では選びにくいかと思います。
今回は Aybe 氏が公開されている『WindowsAPICodePack-Shell』 は如何でしょう。
https://www.nuget.org/packages/WindowsAPICodePack-Shell

※WindowsAPICodePack-Shell を組み込んだ場合、依存関係によって
 WindowsAPICodePack-Core も一緒に組み込まれます。


> (3)自宅のパソコン(複数)、バイト先のパソコン(複数)でも使用したいと思っています。
特に問題ありません。


【使い方】
Imports Microsoft.WindowsAPICodePack.Dialogs
Public Class Form1
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Using dlg As New CommonOpenFileDialog()
            dlg.IsFolderPicker = True
            dlg.Multiselect = False '単一選択 
            dlg.AllowNonFileSystemItems = False 'コントロール パネル等は選べないようにする 
            dlg.Title = "フォルダーを選んでください。"
            If dlg.ShowDialog() = CommonFileDialogResult.Cancel Then
                Return
            End If
            '単一選択モードでは FileName プロパティを使う 
            TextBox1.Text = dlg.FileName
        End Using
    End Sub

    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
        Using dlg As New CommonOpenFileDialog()
            dlg.Multiselect = True  '複数選択 
            dlg.IsFolderPicker = True
            dlg.AllowNonFileSystemItems = False
            dlg.Title = "フォルダーを選んでください。"
            If dlg.ShowDialog() = CommonFileDialogResult.Cancel Then
                Return
            End If
            '複数選択モードでは FileNames プロパティを使う 
            ListBox1.DataSource = dlg.FileNames.ToArray()
        End Using
    End Sub
End Class
投稿者 N88-BASIC  (社会人) 投稿日時 2019/11/26 18:41:41
 魔界の仮面弁士  ご丁寧な説明とサンプルをありがとうございました。

おかげさまで、無事、目的の表示とフォルダーの指定ができました。
ただ、欲深いのか、初期フォルダ(root/initialfolder)の指定が少し異なるようで苦労しました。

今後ともよろしくお願いいたします。

※「エクスプローラー」の件、ご指摘ありがとうございます。以前、和訳の注意点として 4 文字以上のカタカナは最後の「ー」文字は省くという指定を読んだことがあるため、それが記憶の片隅にあるようです。ローカライズされた Windows の表記はプライバシーやセキュリティなど使い分けているようですね。今後は、Windows の画面の表示も気を付けたいと思います。
今気が付いたのですが、自分でもフォルダーとしていますね。
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2019/11/27 11:23:05
解決できたようで何よりです。

CommonOpenFileDialog / CommonSaveFileDialog を使えば、
他にも、ダイアログ上に追加のコントロールを配置したり…
http://tinqwill.blog59.fc2.com/blog-entry-86.html


追加のプレースリストを配置することも可能です。
dlg.ShowPlacesList = True
dlg.AddPlace("C:\Windows", FileDialogAddPlaceLocation.Top)
dlg.AddPlace("C:\Tools\VSImageLibraries", FileDialogAddPlaceLocation.Top)
dlg.AddPlace(DirectCast(KnownFolders.StartMenu, ShellContainer), FileDialogAddPlaceLocation.Bottom)
dlg.AddPlace(DirectCast(KnownFolders.SendTo, ShellContainer), FileDialogAddPlaceLocation.Bottom)





> 和訳の注意点として 4 文字以上のカタカナは最後の「ー」文字は省くという指定を読んだことがあるため、

それはもしかしたら、 JIS Z 8301 のことかもしれません。2008 年版の規格書を読んでみると、
表 G.3 の a) において、そのようなルールが記載されていました。
https://kikakurui.com/z8/Z8301-2011-01.html

一方 Microsoft としては 2008年7月以降、末尾が ‑er、‑or、‑ar となる語彙に対しては
長音をつけるルールに統一されました。
https://www.atmarkit.co.jp/news/200807/25/microsoft.html

なので、VS2008 までは「エクスプローラ」、VS2010では「エクスプローラー」だったりします。



それはさておき、末尾の長音記号の有無はさほど問題になりませんが、
エキスプローラーと言った場合、歯科用の器具を指すことが多いため、一応指摘させてもらいました。
エクスプローラーと同じ英単語から来ていますし、文脈的に誤解を受けることは無いでしょうけれどね。
投稿者 N88-BASIC  (社会人) 投稿日時 2019/11/29 09:02:47
魔界の仮面弁士 さん、さらなる機能のご紹介ありがとうございます。

特にプレースリストの追加は、趣味の作業の効率アップのためにアプリを作成するのがほとんどで、使用するフォルダー構造などが決まっている場合が多いので作業が楽になりそうです。

今後ともよろしくお願いいたします。

※カタカナ表記の件も、ご紹介いただきありがとうございました。
 今後の表記に活用させていただきます。