none
Win10 v1607 FolderBrowserDialog1.RootFolder = Environment.SpecialFolder.MyMusic が変です。 RRS feed

  • 質問

  • 個人プロファイル ミュージックにサブフォルダがある条件で、
    Windows10 アニバーサリー アップグレード後に不審な挙動を示しています。

    Windows10 v1607 build14393.10 (Pro) x64 環境下において、
    Visual Studio 2013 Commuinity Update 5 Visual Basic 2013 06177-004-0444002-02930 で、
    Form デスクトップアプリ で Me.FolderBrowserDialog1.RootFolder = Environment.SpecialFolder.MyMusic
    と設定した場合に、
    Dialog が SubFolder を取得できません。

    .SpecialFolder.MyMusic を .SpecialFolder.MyComputer 等に変更し、
    階層を辿れば、問題なく取得できるのですが。

    サンプルです。
     Button 2, Label 1, FolderBrowserDialog 1 を配置したものです。
    Public Class Form1
    
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    
        End Sub
    
        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
            Me.FolderBrowserDialog1.RootFolder = Environment.SpecialFolder.MyMusic
            Me.FolderBrowserDialog1.ShowNewFolderButton = False
            Me.FolderBrowserDialog1.Description = Me.Text & "  Select Album Folder"
            Dim result As DialogResult = Me.FolderBrowserDialog1.ShowDialog()
            If result = Windows.Forms.DialogResult.OK Then
                Me.Label1.Text = Me.FolderBrowserDialog1.SelectedPath
            End If
        End Sub
    
        Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
            Me.FolderBrowserDialog1.RootFolder = Environment.SpecialFolder.MyComputer
            Me.FolderBrowserDialog1.ShowNewFolderButton = False
            Me.FolderBrowserDialog1.Description = Me.Text & "  Select Album Folder"
            Dim result As DialogResult = Me.FolderBrowserDialog1.ShowDialog()
            If result = Windows.Forms.DialogResult.OK Then
                Me.Label1.Text = Me.FolderBrowserDialog1.SelectedPath
            End If
        End Sub
    End Class

    Windows10 v1511 build10586 (Pro) x64 環境下において、問題は発生していませんでしたので、
    OS の問題(バグ?・仕様変更?)と認識しています。
    何方か、何か情報をお持ちでしょうか?。
    2016年8月7日 8:11

すべての返信

  • 暫定的に ですが、

    以下の投稿 https://shiroyuki-mot-says.blogspot.com/2017/06/vb-folder-dialog-notice-201706.html に纏めた様に、  

      具体的には、
      Root Me.FolderBrowserDialog1.RootFolder を Desktop 若しくは MyComputer にして置き、
      Current の Me.FolderBrowserDialog1.SelectedPath を Environment.SpecialFolder の列挙体にします。
      そして、 .Show する前に、 キーを送ります。
      Tab + Tab + Right キーです。
      Tab + Tab で TreeView を選ばせ、 Right で候補を展開させます。
      これで、 特殊フォルダ が展開された状態で Dialog が開いて来ます。

    と言う対応をしています。

    2017年6月16日 1:20
  • 私の環境(Windows 10 Enterprise 2016 LTSB, Ver 1607, Build 14393.1358)でも再現しました。

    恐らく OS の不具合だと思います。C++ で検証したところ SHBrowseForFolder 関数の引数のフラグで BIF_NEWDIALOGSTYLE を指定しなかった場合には正しくサブフォルダが表示されました。以下確認コードです。

    LPITEMIDLIST pidlRoot = 0;
    if (SUCCEEDED(SHGetSpecialFolderLocation(hWnd, CSIDL_MYMUSIC, &pidlRoot)))
    {
    	BROWSEINFO  bi = { 0 };
    	bi.hwndOwner = hWnd;
    	bi.ulFlags = BIF_RETURNONLYFSDIRS | BIF_NEWDIALOGSTYLE;
    	bi.lpszTitle = TEXT("フォルダを選択してください。");
    	bi.pidlRoot = pidlRoot;
    	LPITEMIDLIST pidl = (LPITEMIDLIST)SHBrowseForFolder(&bi);
    	LPMALLOC pMalloc = 0;
    	if (pidl != NULL && SHGetMalloc(&pMalloc) != E_FAIL)
    	{
    		TCHAR szDirectoryPath[MAX_PATH];
    		SHGetPathFromIDList(pidl, szDirectoryPath);
    		MessageBox(hWnd, szDirectoryPath, TEXT("確認"), 0);
    		pMalloc->Free(pidl);
    		pMalloc->Free(pidlRoot);
    		pMalloc->Release();
    	}
    }

    BIF_NEWDIALOGSTYLE を指定した場合

    BIF_NEWDIALOGSTYLE を指定しなかった場合

    2017年6月16日 8:59
  • kenjinote さま ご検証ありがとうございます。

    C++ は良く分からないのですが、「BIF_NEWDIALOGSTYLE を指定しなかった場合には正しくサブフォルダが表示され」 と言う点は意外な結果に感じます。  これが何を意味するのか?が理解に苦しみます。

    v1607 では .MyMusic のみでしたが、 v1703 では .MyDocuments や .MyPictures も駄目になっています。
    Microsoft として、 My 系の機能はもう不要と判断し出している と言った印象を持っています。

    2017年6月16日 9:49