【C#】レジストリの値を取得・作成する方法|ジェネリックを使って共通化もしてみた

C# レジストリ読み書き

今回はC#でレジストリを読み書きするコードを紹介します。

目次
スポンサーリンク

レジストリを読み込む

レジストリの値を読み込むにはRegistryKeyクラスを使います。

RegistryKey.OpenSubKeyメソッドでキーを開き、RegistryKey.GetValueメソッドで読み込みます。

サンプルコード

using Microsoft.Win32;
using System;
using System.Diagnostics;

namespace RegistryTest
{
    class Program
    {
        static void Main(string[] args)
        {
            // レジストリキーの名前
            string key = @"SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Explorer";
            // 値を取得するレジストリの値の名前
            string name = "AccessDeniedDialog";

            // レジストリの取得
            try
            {
                // レジストリキーのパスを指定してレジストリを開く
                RegistryKey regKey = Registry.LocalMachine.OpenSubKey(key);

                // レジストリの値を取得
                string location = (string)regKey.GetValue(name);

                // 開いたレジストリキーを閉じる
                regKey.Close();

                // コンソールに取得したレジストリの値を表示
                Console.WriteLine(location);
            }
            catch (NullReferenceException)
            {
                // レジストリキーまたは値が存在しない
                Console.WriteLine("レジストリ[{0}]の[{1}]がありません", key, name);
            }
        }
    }
}

実行結果

{100B4FC8-74C1-470F-B1B7-DD7B6BAE79BD}

レジストリを書き込む

レジストリの書き込みには、RegistryKey.CreateSubKeyメソッドでキーを開き、RegistryKey.SetValueメソッドで書き込みます。

サンプルコード

using Microsoft.Win32;
using System;
using System.Diagnostics;

namespace RegistryTest
{
    class Program
    {
		static void Main(string[] args)
		{
			string key = @"SOFTWARE\YuYu";

			try
			{
				RegistryKey regKey = Registry.CurrentUser.CreateSubKey(key);

				// レジストリに書き込み
				// 文字列を書き込む(REG_SZで書き込まれる)
				regKey.SetValue("String", "Hello world!!");
				// 整数(Int32)を書き込む(REG_DWORDで書き込まれる)
				regKey.SetValue("Int", 100);
				// 文字列配列を書き込む(REG_MULTI_SZで書き込まれる)
				string[] sArray = new string[] { "iPhone", "Macbook", "AirPods" };
				regKey.SetValue("StringArray", sArray);
				// バイト配列を書き込む(REG_BINARYで書き込まれる)
				byte[] bArray = new byte[] { 5, 10 ,0 };
				regKey.SetValue("Bytes", bArray);

				// 閉じる
				regKey.Close();
			}
            catch (Exception ex)
            {
                // レジストリキーまたは値が存在しない
                Console.WriteLine(ex.Message);
            }
        }
	}
}

実行結果

しっかりレジストリが書き込めていることが確認できました。

【応用編】ジェネリックメソッド<T>を使ったレジストリの読み込み

ジェネリック<T>を使うことで型の異なるレジストリ値を読み込むことができます。

レジストリを読み込むためのジェネリックメソッド

/// <summary>
/// HKEY_LOCAL_MACHINEのレジストリを読み込む。
/// </summary>
/// <typeparam name="T">読み込む値の型</typeparam>
/// <param name="subKey">レジストリのサブキー</param>
/// <param name="value">レジストリの値名</param>
/// <param name="defaultValue">デフォルト値</param>
/// <returns>レジストリから読み込んだ値</returns>
static T ReadRegKeyHKLM<T>(string subKey, string value, T defaultValue)
{
    try
    {
        using (var key = Registry.LocalMachine.OpenSubKey(subKey))
        {
            if (key == null) return defaultValue;
            return (T)key.GetValue(value, defaultValue);
        }
    }
    catch (Exception e)
    {
        Debug.Assert(false, e.Message);
        return defaultValue;
    }
}

このジェネリックメソッドを使って実際にレジストリを読み込んでみます。

サンプルコード

using Microsoft.Win32;
using System;
using System.Diagnostics;

namespace RegistryTest
{
    class Program
    {
        static void Main(string[] args)
        {
            var key = @"SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Explorer";
            var val = "AccessDeniedDialog";

            Console.WriteLine(ReadRegistryKey<string>(Registry.LocalMachine, key, val, "default"));

            val = "ActiveSetupDisabled";

            Console.WriteLine(ReadRegistryKey<int>(Registry.LocalMachine, key, val, 1));
            Console.ReadLine();
        }

        /// <summary>
        /// 指定のレジストリキーのレジストリを読み込む。
        /// </summary>
        /// <typeparam name="T">読み込む値の型</typeparam>
        /// <param name="regKey">レジストリの親キー名</param>
        /// <param name="subKey">レジストリのサブキー名</param>
        /// <param name="value">レジストリの値名</param>
        /// <param name="defaultValue">デフォルト値</param>
        /// <returns>レジストリから読み込んだ値</returns>
        static T ReadRegistryKey<T>(RegistryKey regKey, string subKey, string value, T defaultValue)
        {
            try
            {
                using (var key = regKey.OpenSubKey(subKey))
                {
                    if (key == null) return defaultValue;
                    return (T)key.GetValue(value, defaultValue);
                }
            }
            catch (Exception e)
            {
                Debug.Assert(false, e.Message);
                return defaultValue;
            }
        }
    }
}

実行結果

{100B4FC8-74C1-470F-B1B7-DD7B6BAE79BD}
0

ジェネリックメソッドを呼び出す際にstringintで型指定することで、同じ関数を使って異なる型のレジストリ値を読み込むことができました。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

都内の精密機器を作っている会社に勤務している14年目のエンジニアです。趣味は美味しいものを食べることとゴルフ。プログラムについて今まで学んだことをわかりやすく発信するサイトを目指しています。

コメント

コメントする

目次