C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

C# エクスプローラー フォルダのレイアウト変更

[トピック内 3 記事 (1 - 3 表示)]  << 0 >>

■87984 / inTopicNo.1)  C# エクスプローラー フォルダのレイアウト変更
  
□投稿者/ Ante (10回)-(2018/07/23(Mon) 16:18:53)

分類:[C#] 

Windows10 C# エクスプローラー フォルダのレイアウト中アイコン設定

お世話になります。

環境:Windows10
C#で、エクスプローラー->表示->レイアウト->中アイコン、に設定したいです。
メソッドが見当たらないのですが、何か方法ありますか?

Win32API使わないとダメです?

よろしくおねがいします。
引用返信 編集キー/
■87991 / inTopicNo.2)  Re[1]: C# エクスプローラー フォルダのレイアウト変更
□投稿者/ 魔界の仮面弁士 (1747回)-(2018/07/23(Mon) 19:15:14)
No87984 (Ante さん) に返信
> 環境:Windows10 
> C#で、エクスプローラー->表示->レイアウト->中アイコン、に設定したいです。


using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.IO;

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        var sizes = new Dictionary<uint, string>
        {
            {256u, "特大"},
            {96u, "大"},
            {48u, "中"},
            {16u, "小"},
        };

        comboBox1.DropDownStyle = ComboBoxStyle.DropDownList;
        comboBox1.DataSource = sizes.ToArray();
        comboBox1.ValueMember = "Key";
        comboBox1.DisplayMember = "Value";
        comboBox1.SelectedIndex = 2;
    }

    private void button1_Click(object sender, EventArgs e)
    {
        foreach (var w in GetExplorer())
        {
            if(Confirm(w.Path, w.LocationName))
            {
                var sfv = w.Document;
                sfv.CurrentViewMode = 1u;
                sfv.IconSize = comboBox1.SelectedValue;
                Marshal.ReleaseComObject(sfv);
            }
        }
    }

    private bool Confirm(string path, string location)
    {
        return DialogResult.Yes == MessageBox.Show(
            this,
            "このフォルダのアイコンサイズを変更しますか?\r\n" + location + "\r\n" + path,
            "確認",
            MessageBoxButtons.YesNo,
            MessageBoxIcon.Question,
            MessageBoxDefaultButton.Button2);
    }

    private IEnumerable<dynamic> GetExplorer()
    {
        dynamic exp = Activator.CreateInstance(Type.GetTypeFromCLSID(Guid.Parse("{9BA05972-F6A8-11CF-A442-00A0C90A8F39}")));
        System.Runtime.InteropServices.ComTypes.IEnumVARIANT f = exp._NewEnum;
        object[] varRes = new object[1];
        while (f.Next(1, varRes, IntPtr.Zero) == 0)
        {
            dynamic w = varRes.FirstOrDefault();
            if (w != null)
            {
                if (Path.GetFileName(w.FullName).ToLowerInvariant() == "explorer.exe")
                {
                    yield return w;
                }
                if (Marshal.IsComObject(w))
                {
                    Marshal.ReleaseComObject(w);
                }
            }
        }
        if(Marshal.IsComObject(f))
        {
            Marshal.ReleaseComObject(f);
        }
        Marshal.ReleaseComObject(exp);
    }
}

引用返信 編集キー/
■87992 / inTopicNo.3)  Re[2]: C# エクスプローラー フォルダのレイアウト変更
□投稿者/ Ante (11回)-(2018/07/23(Mon) 19:48:01)
2018/07/23(Mon) 19:48:42 編集(投稿者)

No87991 (魔界の仮面弁士 さん) に返信

魔界の仮面弁士さん

サンプルまでありがとうございます。
いつも勉強させてもらっており光栄です。

COM経由ですけど、下記利用しても行けそうですね。

using Shell32; // 参照設定: Microsoft Shell Controls And Automation
using SHDocVw; // 参照設定: Microsoft Internet Controls

ShellBrowserWindow
ShellFolderView

Type t = Type.GetTypeFromCLSID(new Guid("C08AFD90-F2A1-11D1-8455-00A0C91F3880"));

解決しました。

解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ