ここでは、レジストリから値を読み込む、レジストリに値を書き込む、レジストリの値やキーを削除する方法を紹介します。レジストリの操作全般は、RegistryKeyクラスを使って行うことができます。
まずはじめにレジストリに書き込む例を示します。RegistryKey.CreateSubKeyメソッドでキーを開き、RegistryKey.SetValueメソッドで書き込みます。
次の例では、レジストリのキー"HKEY_CURRENT_USER\Software\test\sub"にデータを書き込んでいます。
'キー(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") '整数(Int32)を書き込む(REG_DWORDで書き込まれる) regkey.SetValue("int", 100) '文字列配列を書き込む(REG_MULTI_SZで書き込まれる) Dim s As String() = New String() {"1", "2", "3"} regkey.SetValue("StringArray", s) 'バイト配列を書き込む(REG_BINARYで書き込まれる) Dim bs As Byte() = New Byte() {0, 1, 2} regkey.SetValue("Bytes", bs) '閉じる regkey.Close()
//キー(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"); //整数(Int32)を書き込む(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メソッドで値の名前に空白文字列""、または、Nothing(C#では、null)を指定します。
補足:Int32型以外の整数は、REG_SZで書き込まれます。REG_DWORDで書き込まれるようにするには、Int32型に変換するか、「データ型を指定して書き込む」の方法を使ってください。
例えば、UInt32型の整数をREG_DWORDで書き込むためにInt32型に変換するには、「BitConverter.ToInt32(BitConverter.GetBytes(uintValue), 0)」としたり、C#であれば、「unchecked((int)uintValue)」とする方法があります。
負のInt32型整数は、REG_DWORDで書き込まれます。例えば -1 は、REG_DWORD で 0xffffffff と書き込まれます。ただしこのようにして書き込まれた値は、「レジストリから読み込む」のようにGetValueメソッドでInt32型として読み込めば元のまま負の整数として取得できますので、通常は特に気にする必要はありません。
補足:レジストリのキーを開くためにCreateSubKeyを使うか、OpenSubKeyを使うか迷うかもしれませんが、OpenSubKeyは指定のない限り読み取り専用で開くため、レジストリに書き込むときはCreateSubKeyで開き、読み取るときはOpenSubKeyで開くというのが基本となるでしょう。
.NET Framework 2.0からは、SetValueメソッドの3番目のパラメータにより、レジストリデータ型を指定して書き込むことができます。書き込もうとしている値が指定されたデータ型と一致しない場合は、エラーが発生します。
下にREG_EXPAND_SZとREG_QWORDで書き込む例を示します。
'キー(HKEY_CURRENT_USER\Software\test\sub)を開く 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()
//キー(HKEY_CURRENT_USER\Software\test\sub)を開く 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列挙体のメンバとその意味は、次のようなものです(MSDNからの抜粋)。
RegistryValueKind列挙体のメンバ名 | 説明 |
---|---|
Binary | バイナリデータ。Win32 APIのREG_BINARYに相当。 |
DWord | 32ビットのバイナリ数値。0x00000000~0xFFFFFFFF(0~4294967295)の値。Win32 APIのREG_DWORDに相当。 |
ExpandString | 値を取得するときに展開される環境変数(%PATH%など)を含む文字列。Win32 APIのREG_EXPAND_SZに相当。 |
MultiString | 文字列の配列。Win32 APIのREG_MULTI_SZに相当。 |
QWord | 64ビットのバイナリ数値。0x0000000000000000~0xFFFFFFFFFFFFFFFF(0~18446744073709551615)の値。Win32 APIのREG_QWORDに相当。 |
String | 文字列。Win32 APIのREG_SZに相当。 |
Unknown | Win32 APIのREG_RESOURCE_LISTのような、サポートされていないレジストリ データ型。既定値。 |
.NET Framework 2.0からは、静的メソッドのRegistry.SetValueを使ってレジストリに書き込むことができます。このメソッドは内部で、RegistryKey.CreateSubKeyでキーを開き、SetValueで書き込み、Closeで閉じています。
VB.NETでは、My.Computer.Registry.SetValueメソッドでレジストリに書き込むこともできます。このメソッドは、Registry.SetValueメソッドを呼び出しているだけです。
Microsoft.Win32.Registry.SetValue( "HKEY_CURRENT_USER\Software\test\sub", "string", "StringValue") My.Computer.Registry.SetValue( "HKEY_CURRENT_USER\Software\test\sub", "int", 100)
Microsoft.Win32.Registry.SetValue( @"HKEY_CURRENT_USER\Software\test\sub", "string", "StringValue");
次にレジストリから値を読み込む方法を紹介します。RegistryKey.OpenSubKeyメソッドでキーを開き、RegistryKey.GetValueメソッドで読み込みます。
次の例では、「レジストリに書き込む」で書き込んだ値を取得しています。
'キー(HKEY_CURRENT_USER\Software\test\sub)を読み取り専用で開く Dim regkey As Microsoft.Win32.RegistryKey = _ Microsoft.Win32.Registry.CurrentUser.OpenSubKey("Software\test\sub", False) 'キーが存在しないときは null が返される If regkey Is Nothing Then Return End If '文字列を読み込む '指定した名前の値が存在しないときは null が返される Dim stringValue As String = DirectCast(regkey.GetValue("string"), String) 'キーに値が存在しないときに指定した値を返すようにするには、次のようにする '(ここでは"default"を返す) 'Dim stringValue As String = DirectCast(regkey.GetValue("string", "default"), String) '整数(REG_DWORD)を読み込む Dim intValue As Integer = CInt(regkey.GetValue("int")) '整数(REG_QWORD)を読み込む Dim longVal As Long = CLng(regkey.GetValue("QWord")) '文字列配列を読み込む Dim strings As String() = DirectCast(regkey.GetValue("StringArray"), String()) 'バイト配列を読み込む Dim bytes As Byte() = DirectCast(regkey.GetValue("Bytes"), Byte()) '閉じる regkey.Close()
//キー(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"); //整数(REG_DWORD)を読み込む int intValue = (int)regkey.GetValue("int"); //整数(REG_QWORD)を読み込む long longVal = (long)regkey.GetValue("QWord"); //文字列配列を読み込む string[] strings = (string[])regkey.GetValue("StringArray"); //バイト配列を読み込む byte[] bytes = (byte[])regkey.GetValue("Bytes"); //閉じる regkey.Close();
なお、「(既定)」「(標準)」から読み取るには、GetValueメソッドで値の名前に空白文字列""、または、Nothing(C#では、null)を指定します。
補足:REG_DWORDの値がInt32.MaxValue(0x7FFFFFFF)より大きい場合は、負の整数として取得されます。例えば、0xFFFFFFFF は -1 となります。
例えば、REG_DWORDの値をInt32型として取得した後、UInt32型に変換するには、「BitConverter.ToUInt32(BitConverter.GetBytes(intValue), 0)」としたり、C#であれば、「unchecked((uint)intValue)」とする方法があります。
.NET Framework 2.0からは、静的メソッドのRegistry.GetValueを使ってレジストリから値を読み込むことができます。このメソッドは内部で、RegistryKey.OpenSubKeyでキーを開き、GetValueで読み取り、Closeで閉じています。
値が見つからなかった場合は、3番目のパラメータに指定した既定値が返されます。キーが見つからなかった場合は、null(VB.NETでは、Nothing)が返されます。
VB.NETでは、My.Computer.Registry.GetValueメソッドでレジストリから値を読み込むこともできます。このメソッドは、Registry.GetValueメソッドを呼び出しているだけです。
Dim stringValue As String = DirectCast( _ Microsoft.Win32.Registry.GetValue( _ "HKEY_CURRENT_USER\Software\test\sub", "string", "default"), String) Dim intValue As Integer = CInt( _ Microsoft.Win32.Registry.GetValue( _ "HKEY_CURRENT_USER\Software\test\sub", "int", 0))
string stringValue = (string)Microsoft.Win32.Registry.GetValue( @"HKEY_CURRENT_USER\Software\test\sub", "string", "default");
指定したキーにあるすべてのキーを取得するには、RegistryKey.GetSubKeyNamesメソッドを使います。また、指定したキーにあるすべての値の名前を取得するには、RegistryKey.GetValueNamesメソッドを使います。
'キーを読み取り専用で開く Dim regkey As Microsoft.Win32.RegistryKey = _ Microsoft.Win32.Registry.CurrentUser.OpenSubKey("Software\test\sub", False) '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()
//キーを読み取り専用で開く Microsoft.Win32.RegistryKey regkey = Microsoft.Win32.Registry.CurrentUser.OpenSubKey(@"Software\test\sub", false); //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();
.NET Framework 2.0からは、REG_SZやREG_DWORDなどの値の種類を、GetValueKindメソッドを使ってRegistryValueKind列挙体として取得することができます。なおRegistryValueKind列挙体については、「データ型を指定して書き込む」をご覧ください。
'キーを読み取り専用で開く Dim regkey As Microsoft.Win32.RegistryKey = _ Microsoft.Win32.Registry.CurrentUser.OpenSubKey("Software\test\sub", False) '"string"の値がREG_SZか調べる If regkey.GetValueKind("string") = Microsoft.Win32.RegistryValueKind.String Then 'REG_SZだった時は、String型として取得する Dim stringValue As String = DirectCast(regkey.GetValue("string"), String) End If '閉じる regkey.Close()
//キーを読み取り専用で開く Microsoft.Win32.RegistryKey regkey = Microsoft.Win32.Registry.CurrentUser.OpenSubKey(@"Software\test\sub", false); //"string"の値がREG_SZか調べる if (regkey.GetValueKind("string") == Microsoft.Win32.RegistryValueKind.String) { //REG_SZだった時は、String型として取得する string stringValue = (string)regkey.GetValue("string"); } //閉じる regkey.Close();
.NET Framework 2.0からは、GetValueメソッドの3番目のパラメータにRegistryValueOptions.DoNotExpandEnvironmentNamesを指定することにより、環境変数を展開せずに値を取得できます。
'レジストリからの読み取り 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()
//レジストリからの読み取り 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はサブキーもろとも削除します。
'レジストリの削除 'キーを書き込み許可で開く 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")
//レジストリの削除 //キーを書き込み許可で開く 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");