potisanのプログラミングメモ

プログラミング素人です。昔の自分を育ててくれたネット情報に少しでも貢献できるよう、情報を貯めていこうと思っています。Windows環境のC++やC#がメインです。

C# 7.1 コントロールパネルに表示される項目のCLSIDと名前をレジストリから取得する

はじめに

コントロールパネルに表示される項目のCLSIDと名前(登録上の名前)をレジストリから取得する方法です。

コード

using System;
using System.Linq;
using Microsoft.Win32;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            using (var key = OpenControlPanelNameSpaceKey(false))
            {
                var nameSpaceClsids = key.GetSubKeyNames()
                    .Select(name => Guid.TryParseExact(name, "B", out var guid) ? guid : Guid.Empty)
                    .Where(clsid => clsid != Guid.Empty);

                var nameSpaceClsidAndName = nameSpaceClsids.Select(clsid =>
                    {
                        using (var subKey = key.OpenSubKey(
                            clsid.ToString("B"), false))
                        {
                            return (clsid, subKey.GetValue(null, null));
                        }
                    });

                foreach (var clsidAndName in nameSpaceClsidAndName)
                {
                    Console.WriteLine(clsidAndName.ToString());
                }

                Console.ReadKey();
            }
        }

        private 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);
            }
        }
    }
}

開発環境等

参考

  1. How to Register Executable Control Panel Items - MSDN

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