今回は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
ジェネリックメソッドを呼び出す際にstring
やint
で型指定することで、同じ関数を使って異なる型のレジストリ値を読み込むことができました。
【C#超入門】ジェネリックを使って関数やクラスを共通化する方法
今回はC#のジェネリック<T>について解説します。 この記事はこんな人におすすめ ジェネリック<T>の役割を知りたいジェネリック<T>の使い方を知りたい…
コメント