DOBON.NET プログラミング道: .NET Framework, VB.NET, C#, Visual Basic, Visual Studio, インストーラ, ...

DOBON.NET

レジストリの操作

レジストリへの書き込み、読み込み、削除を行う

レジストリから値を読み込む、レジストリに値を書き込む、レジストリの値やキーを削除する方法を紹介します。レジストリの操作全般はRegistryKeyクラスを使って行うことができます。

レジストリへの書き込み

まず初めにレジストリに書き込む例を示します。RegistryKey.CreateSubKeyメソッドでキーを開き、RegistryKey.SetValueメソッドで書き込みます。

次の例では、レジストリのキー"HKEY_CURRENT_USER\Software\test\sub"にデータを書き込んでいます。

[VB.NET]
'レジストリへの書き込み
'(「HKEY_CURRENT_USER\Software\test\sub」に書き込む)
'キーを開く
Dim regkey As Microsoft.Win32.RegistryKey = _
    Microsoft.Win32.Registry.CurrentUser.CreateSubKey("Software\test\sub")
'上のコードでは指定したキーが存在しないときは新しく作成される。
'作成されないようにするには次のようにする。
'Dim regkey As Microsoft.Win32.RegistryKey = _
'   Microsoft.Win32.Registry.CurrentUser.OpenSubKey("Software\test\sub", True)

'レジストリへの書き込み
'文字列を書き込む(REG_SZで書き込まれる)
regkey.SetValue("string", "StringValue")
'整数を書き込む(REG_DWORDで書き込まれる)
regkey.SetValue("int", 100)
'文字列配列を書き込む(REG_MULTI_SZで書き込まれる)
Dim s As String() = {"1", "2", "3"}
regkey.SetValue("StringArray", s)
'バイト配列を書き込む(REG_BINARYで書き込まれる)
Dim bs As Byte() = {0, 1, 2}
regkey.SetValue("Bytes", bs)

'閉じる
regkey.Close()
[C#]
//レジストリへの書き込み
//(「HKEY_CURRENT_USER\Software\test\sub」に書き込む)
//キーを開く
Microsoft.Win32.RegistryKey regkey =
    Microsoft.Win32.Registry.CurrentUser.CreateSubKey(@"Software\test\sub");
//上のコードでは指定したキーが存在しないときは新しく作成される。
//作成されないようにするには次のようにする。
//Microsoft.Win32.RegistryKey regkey =
//    Microsoft.Win32.Registry.CurrentUser.OpenSubKey(@"Software\test\sub", true);

//レジストリへの書き込み
//文字列を書き込む(REG_SZで書き込まれる)
regkey.SetValue("string", "StringValue");
//整数を書き込む(REG_DWORDで書き込まれる)
regkey.SetValue("int", 100);
//文字列配列を書き込む(REG_MULTI_SZで書き込まれる)
string[] s = new string[] {"1", "2", "3"};
regkey.SetValue("StringArray", s);
//バイト配列を書き込む(REG_BINARYで書き込まれる)
byte[] bs = new byte[] {0, 1, 2};
regkey.SetValue("Bytes", bs);

//閉じる
regkey.Close();

レジストリエディタで見ると、"HKEY_CURRENT_USER\Software\test\sub"に次のように書き込まれます。

「(標準)」に書き込むには、SetValueメソッドで値の名前に空白文字列""を指定します。

補足:.NET Framework 2.0以降のVB.NETでは、My.Computer.Registry.SetValueメソッドでレジストリに書き込むこともできます。

データ型を指定して書き込む

.NET Framework 2.0からは、SetValueメソッドの3番目のパラメータにより、レジストリデータ型を指定して書き込むことができます。書き込もうとしている値が指定されたデータ型と一致しない場合は、エラーが発生します。

下にREG_EXPAND_SZとREG_QWORDで書き込む例を示します。

[VB.NET]
'レジストリへの書き込み
Dim regkey As Microsoft.Win32.RegistryKey = _
    Microsoft.Win32.Registry.CurrentUser.CreateSubKey("Software\test\sub")

'REG_EXPAND_SZで書き込む
regkey.SetValue("ExpandString", "%windir%", _
    Microsoft.Win32.RegistryValueKind.ExpandString)
'REG_QWORDで書き込む
regkey.SetValue("QWord", 1000, Microsoft.Win32.RegistryValueKind.QWord)

'閉じる
regkey.Close()
[C#]
//レジストリへの書き込み
Microsoft.Win32.RegistryKey regkey =
    Microsoft.Win32.Registry.CurrentUser.CreateSubKey(@"Software\test\sub");

//REG_EXPAND_SZで書き込む
regkey.SetValue("ExpandString", "%windir%",
    Microsoft.Win32.RegistryValueKind.ExpandString);
//REG_QWORDで書き込む
regkey.SetValue("QWord", 1000, Microsoft.Win32.RegistryValueKind.QWord);

//閉じる
regkey.Close();

SetValueメソッドの3番目のパラメータに指定できるRegistryValueKind列挙体のメンバとその意味は、次のようなものです(ヘルプからの抜粋)。

RegistryValueKind列挙体のメンバ名 説明
Binary バイナリデータ。Win32 APIのREG_BINARYに相当。
DWord 32ビットのバイナリ数値。Win32 APIのREG_DWORDに相当。
ExpandString 値を取得するときに展開される環境変数(%PATH%など)を含む文字列。Win32 APIのREG_EXPAND_SZに相当。
MultiString 文字列の配列。Win32 APIのREG_MULTI_SZに相当。
QWord 64ビットのバイナリ数値。Win32 APIのREG_QWORDに相当。
String 文字列。Win32 APIのREG_SZに相当。
Unknown Win32 APIのREG_RESOURCE_LISTのような、サポートされていないレジストリ データ型。既定値。

レジストリからの読み込み

次にレジストリから値を読み込む例を示します。RegistryKey.OpenSubKeyメソッドでキーを開き、RegistryKey.GetValueメソッドで読み込みます。

下の例では指定されたキー("HKEY_CURRENT_USER\Software\test\sub")にある値の取得と、その下にあるすべてのキーと値を取得する方法も示しています。

[VB.NET]
'レジストリからの読み取り
'(「HKEY_CURRENT_USER\Software\test\sub」にあるデータの値を取得)
'キーを読み取り専用で開く
Dim regkey As Microsoft.Win32.RegistryKey = _
    Microsoft.Win32.Registry.CurrentUser.OpenSubKey("Software\test\sub", False)
'キーが存在しないときはNothingが返される
If (regkey Is Nothing) Then Return

'文字列を読み込む
'読み込む値が存在しないときはNothingが返される
Dim stringValue As String = CType(regkey.GetValue("string"), String)
'キーに値が存在しないときに指定した値を返すようにするには、次のようにする
'(ここでは"default"を返す)
'Dim stringValue As String = CType(regkey.GetValue("string", "default"))

'整数を読み込む
Dim intValue As Integer = CType(regkey.GetValue("int"), Integer)
'文字列配列を読み込む
Dim strings As String() = CType(regkey.GetValue("StringArray"), String())
'バイト配列を読み込む
Dim bytes As Byte() = Ctype(regkey.GetValue("Bytes"), Byte())

'sub以下にあるキーの数を表示
Console.WriteLine("サブキーの数:{0}", regkey.SubKeyCount)
'sub以下のすべてのキー名を取得
Dim keyNames() As String = regkey.GetSubKeyNames() 
'表示する
Dim k As String
For Each k In keyNames
    Console.WriteLine(k)
Next

'sub以下にある値の数を表示
Console.WriteLine("値の数:{0}", regkey.ValueCount)
'sub以下のすべての値名を取得
Dim valueNames() As String = regkey.GetValueNames() 
'表示する
Dim v As String
For Each v In valueNames
    Console.WriteLine(v)
Next

'閉じる
regkey.Close()
[C#]
//レジストリからの読み取り
//(「HKEY_CURRENT_USER\Software\test\sub」にあるデータの値を取得)
//キーを読み取り専用で開く
Microsoft.Win32.RegistryKey regkey =
    Microsoft.Win32.Registry.CurrentUser.OpenSubKey(@"Software\test\sub", false);
//キーが存在しないときは null が返される
if (regkey == null) return;

//文字列を読み込む
//読み込む値が存在しないときは null が返される
string stringValue = (string) regkey.GetValue("string");
//キーに値が存在しないときに指定した値を返すようにするには、次のようにする
//(ここでは"default"を返す)
//string stringValue = (string) regkey.GetValue("string", "default");

//整数を読み込む
int intValue = (int) regkey.GetValue("int");
//文字列配列を読み込む
string[] strings = (string[]) regkey.GetValue("StringArray");
//バイト配列を読み込む
byte[] bytes = (byte[]) regkey.GetValue("Bytes");

//sub以下にあるキーの数を表示
Console.WriteLine("サブキーの数:{0}", regkey.SubKeyCount);
//sub以下のすべてのキー名を取得
string[] keyNames = regkey.GetSubKeyNames();
//表示する
foreach (string k in keyNames)
    Console.WriteLine(k);

//sub以下にある値の数を表示
Console.WriteLine("キーの値の数:{0}", regkey.ValueCount);
//sub以下のすべての値名を取得
string[] valueNames = regkey.GetValueNames();
//表示する
foreach (string v in valueNames)
    Console.WriteLine(v);

//閉じる
regkey.Close();

なお、「(標準)」から読み取るには、GetValueメソッドで値の名前に空白文字列""を指定します。

補足:.NET Framework 2.0以降のVB.NETでは、My.Computer.Registry.GetValueメソッドでレジストリの値を読み込むこともできます。

REG_EXPAND_SZ型のデータを展開せずに取得する

.NET Framework 2.0からは、GetValueメソッドの3番目のパラメータにRegistryValueOptions.DoNotExpandEnvironmentNamesを指定することにより、環境変数を展開せずに値を取得できます。

[VB.NET]
'レジストリからの読み取り
Dim regkey As Microsoft.Win32.RegistryKey = _
    Microsoft.Win32.Registry.CurrentUser.OpenSubKey("Software\test\sub", False)
If regkey Is Nothing Then
    Return
End If

'REG_EXPAND_SZデータ型の値を取得する
Dim stringValue As String
'展開して取得する
stringValue = CStr(regkey.GetValue("ExpandString"))
Console.WriteLine(stringValue)
'展開せずに取得する
stringValue = CStr(regkey.GetValue("ExpandString", "", _
    Microsoft.Win32.RegistryValueOptions.DoNotExpandEnvironmentNames))
Console.WriteLine(stringValue)

'閉じる
regkey.Close()
[C#]
//レジストリからの読み取り
Microsoft.Win32.RegistryKey regkey =
    Microsoft.Win32.Registry.CurrentUser.OpenSubKey(@"Software\test\sub", false);
if (regkey == null) return;

//REG_EXPAND_SZデータ型の値を取得する
string stringValue;
//展開して取得する
stringValue = (string)regkey.GetValue("ExpandString");
Console.WriteLine(stringValue);
//展開せずに取得する
stringValue = (string)regkey.GetValue("ExpandString", "",
    Microsoft.Win32.RegistryValueOptions.DoNotExpandEnvironmentNames);
Console.WriteLine(stringValue);

//閉じる
regkey.Close();

レジストリの削除

最後にレジストリのキーまたは値を削除する例です。キーにある値を削除するには、RegistryKey.DeleteValueメソッドを使用します。キーの削除はDeleteSubKeyまたはDeleteSubKeyTreeメソッドで行います。DeleteSubKeyは削除しようとするキーに子サブキーが存在すると削除に失敗しますが、DeleteSubKeyTreeは子サブキーもろとも削除します。

[VB.NET]
'レジストリの削除
'キーを書き込み許可で開く
Dim regkey As Microsoft.Win32.RegistryKey = _
    Microsoft.Win32.Registry.CurrentUser.OpenSubKey("Software\test", True)

'キーにある値の削除
'"HKEY_CURRENT_USER\Software\test"にある"string"という値を削除する
regkey.DeleteValue("string")
'次のようにすると指定した値が見つからなくてもエラーが出ない
'regkey.DeleteValue("string", False)

'キーを削除(子サブキーがあるとエラーになる)
'"HKEY_CURRENT_USER\Software\test\sub"を削除する
regkey.DeleteSubKey("sub")
'次のようにすると指定したキーが見つからなくてもエラーが出ない
'regkey.DeleteSubKey("sub", False)

'閉じる
regkey.Close()

'キーとそのツリーを根こそぎ削除
'"HKEY_CURRENT_USER\Software\test"を削除する
Microsoft.Win32.Registry.CurrentUser.DeleteSubKeyTree("Software\test")
[C#]
//レジストリの削除
//キーを書き込み許可で開く
Microsoft.Win32.RegistryKey regkey =
    Microsoft.Win32.Registry.CurrentUser.OpenSubKey(@"Software\test", true);

//キーにある値の削除
//"HKEY_CURRENT_USER\Software\test"にある"string"という値を削除する
regkey.DeleteValue("string");
//次のようにすると指定した値が見つからなくてもエラーが出ない
//regkey.DeleteValue("string", false);

//キーを削除(子サブキーがあるとエラーになる)
//"HKEY_CURRENT_USER\Software\test\sub"を削除する
regkey.DeleteSubKey("sub");
//次のようにすると指定したキーが見つからなくてもエラーが出ない
//regkey.DeleteSubKey("sub", false);

//閉じる
regkey.Close();

//キーとそのツリーを根こそぎ削除
//"HKEY_CURRENT_USER\Software\test"を削除する
Microsoft.Win32.Registry.CurrentUser.DeleteSubKeyTree(@"Software\test");

補足:レジストリのキーを開くためにCreateSubKeyを使うか、OpenSubKeyを使うか迷うところですが、OpenSubKeyは指定のない限り読み取り専用で開くため、レジストリに書き込むときはCreateSubKeyで開き、読み取るときはOpenSubKeyで開くというのが基本となりそうです。

  • 履歴:
  • 2007/2/24 「データ型を指定して書き込む」、「REG_EXPAND_SZ型のデータを展開せずに取得する」を追加。

注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。

  • このサイトで紹介されているコードの多くは、例外処理が省略されています。例外処理については、こちらをご覧ください。