potisanのプログラミングメモ

趣味のプログラマーがプログラミング関係で気になったことや調べたことをいつでも忘れられるようにメモするブログです。はてなブログ無料版なので記事の上の方はたぶん広告です。記事中にも広告挿入されるみたいです。

C# コントロールパネルに表示される項目のローカライズされた名前をレジストリから取得する

参照設定

下記投稿のクラスを使用しています。

コード

using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Win32;
using Oxalis.Windows.Text;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            var controlPaneNameSpaceClsids = ControlPanelNameSpaceUtility.GetControlPanelNameSpaceClsids();
            using (var clsidKey = RegistryKey.OpenBaseKey(RegistryHive.ClassesRoot, RegistryView.Registry64))
            {
                var clsidAndIndirectLocalizedStrings = controlPaneNameSpaceClsids.Select(
                    clsid =>
                    {
                        using (var key = clsidKey.OpenSubKey("CLSID\\" + clsid.ToString("B"), false))
                        {
                            return (clsid, (string)key?.GetValue("LocalizedString"));
                        }
                    });
                var s = ShellIndirectString.Load(clsidAndIndirectLocalizedStrings.First().Item2);
                var clsidAndDirectLocalizedStrings = clsidAndIndirectLocalizedStrings.Select(
                    source => (source, ShellIndirectString.LoadDefault(source.Item2, null)));

                foreach (var clsidAndLocalizedString in clsidAndDirectLocalizedStrings)
                {
                    Console.WriteLine(clsidAndLocalizedString);
                }
                Console.ReadKey();
            }
        }
    }

    public static class ControlPanelNameSpaceUtility
    {
        public const string ControlPanelNameSpacePath =
            @"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\ControlPanel\NameSpace";

        public static RegistryKey OpenControlPanelNameSpaceKey(
            bool writable,
            RegistryView view = RegistryView.Registry64)
        {
            using (var key = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, view))
            {
                return key.OpenSubKey(ControlPanelNameSpacePath, writable);
            }
        }

        public static IEnumerable<Guid> GetControlPanelNameSpaceClsids()
        {
            using (var key = OpenControlPanelNameSpaceKey(false))
            {
                return key.GetSubKeyNames()
                    .Select(name => Guid.TryParseExact(name, "B", out var guid) ? guid : Guid.Empty)
                    .Where(clsid => clsid != Guid.Empty);
            }
        }
    }
}

開発環境等

参考

2021/3/10:この記事は別のブログで投稿した記事を移動したものです。