読者です 読者をやめる 読者になる 読者になる

FolderBrowserDialogのRootFolderをDesktopDirectoryにすると、Windows10では死ぬ

.NETでフォルダ参照ダイアログにFolderBrowserDialogを使ってるのだが、プロパティのRootFolderにDesktopDirectoryを指定すると、Windows10ではフォルダ参照が機能しなくなる。

サンプルのフォルダ参照ダイアログ表示処理

RootFolderを指定しないFolderBrowserDialogの例として、以下のようなプログラムを用意した。

FolderBrowserDialog dialog = new FolderBrowserDialog();
dialog.Description = "素のFolderBrowserDialog";
DialogResult result = dialog.ShowDialog();

RootFolderを指定するFolderBrowserDialogの例として、以下のようなプログラムを用意した。

FolderBrowserDialog dialog = new FolderBrowserDialog();
dialog.RootFolder = Environment.SpecialFolder.DesktopDirectory;
dialog.Description = "RootFolderをDesktopDirectoryにしたFolderBrowserDialog";
DialogResult result = dialog.ShowDialog();

Windows7での動作

上のサンプルをWindows7で動かしてみる。
まずはRootFolderを指定しないFolderBrowserDialog。
f:id:nave_kazu:20160914175801p:plain

続いてRootFolderを指定するFolderBrowserDialog。
f:id:nave_kazu:20160914175806p:plain

見た目はまったく同じ。

Windows10での動作

これがWindows10だと、こうなる。
まずはRootFolderを指定しないFolderBrowserDialog。
f:id:nave_kazu:20160914175811p:plain

続いてRootFolderを指定するFolderBrowserDialog。
f:id:nave_kazu:20160914175814p:plain

すっからかんになった。
デスクトップの下はデスクトップにあるフォルダしか表示されなくなる。

回避策

そもそも、RootFolderの指定にDesktopDirectoryを指定するからこうなるのであって、デスクトップを初期表示したければ規定値のDesktop(DesktopDirectoryではなくDesktop)を使えということ。
MSDNによるとDesktopDirectoryは「デスクトップ上のファイル オブジェクトを物理的に格納するために使用されるディレクトリ。」となっている。
Desktopは「物理的なファイル システム上の場所ではない論理的なデスクトップ。」となっている。

いままでは物理的には実在しない「コンピュータ」とか「コントロールパネル」を表示していたが、Windows10からは厳密に実在するフォルダしか表示しないという動きに変わったということ。
Windows8.1は、Windows7と同じ動きをしていた。

Windows10対応のひとつだね。