potisanのプログラミングメモ

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

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:この記事は別のブログで投稿した記事を移動したものです。