酢ろぐ!

カレーが嫌いなスマートフォンアプリプログラマのブログ。

Windows Mobileでレジストリを制御する

.NET Compact FrameworkでもWindows共通で使用されている設定情報のデータベースであるレジストリの設定値の参照や書き込みができます。ここではレジストリの扱い方についてみていきます。

レジストリの構造

レジストリ(Registry)は、キーサブキー、およびエントリからなる階層構造で編成されています。

"キー"と"サブキー"は、エクスプローラーのフォルダのように、キーの中にサブキーが含まれている事があり、サブキーには更にサブキーが含める事が出来ます。キーとサブキーには、"エントリ"と呼ばれるデータを格納することが出来、Windows Mobile OSやアプリケーションの設定値、各種デバイスの調整値などの情報が格納されています。

f:id:ch3cooh393:20140815011923p:plain

ルートのキーの名前は、以下の通りです。

  • HKEY_CLASSES_ROOT
    • ファイルの関連付けや拡張子の情報などが格納されています。
  • HKEY_CURRENT_USER
    • 現在ログインしているユーザーの情報などが格納されています。
  • HKEY_LOCAL_MACHINE
    • システムに関する情報などが格納されています。
  • HKEY_USERS
    • ユーザー個別の設定情報などが格納されています。
  • HKEY_CURRENT_CONFIG
    • 起動時に使用されるシステム情報が格納されています。

これらのキーとエントリは、どのアプリからも参照・変更する事が可能なため、セキュリティ関連データや重要なアプリケーション情報は、極力格納しないようにするのが推奨されています。また、他アプリで使用するレジストリの値を変更、または削除してしまうと予期せぬ不具合が発生する可能性があり、最悪の場合端末が起動しなくなる恐れがありますので注意を払いましょう。

.NET Compact Framework からは、Microsoft.Win32名前空間のRegistryKeyクラスを利用する事で、レジストリキーの追加・参照・削除等の操作が可能です。本節ではレジストリに関する操作についてご紹介します。

それぞれ追加・参照・削除の処理に対応したButtonコントロールと、参照したエントリを表示する為のTextBoxコントロールを配置したサンプルアプリを以下に示します。

f:id:ch3cooh393:20140815011948p:plain

レジストリを制御する

レジストリキーの作成

レジストリキーを作成します。HKEY_CURRENT_USERのサブキーRegAppと、更にそのサブキーInfo を作成し、サブキーInfo にはアプリの使用ユーザの情報(名前と年齢)を格納するエントリUserNameとAgeを作成します。

private void button1_Click(object sender, EventArgs e)
{
  // HKEY_CURRENT_USER にサブキー「RegApp」を作成します
  using (Microsoft.Win32.RegistryKey reg = Registry.CurrentUser.CreateSubKey("RegApp"))
  {
    // HKEY_CURRENT_USER\RegApp の下にサブキーを作成します
    using (Microsoft.Win32.RegistryKey info = reg.CreateSubKey("Info"))
    {
      // HKEY_CURRENT_USER\RegApp\Info にエントリを作成します
      info.SetValue("UserName", "Taro Tanaka");
      info.SetValue("Age", 28);
    }
  }
}

上記の処理を実行すると指定したサブキーとエントリが作成されます。このサンプルコードでは扱っておりませんが、Windows CEをベースにしたWindows Mobileでは、サブキーの深さの最大値は15までとなっています。

レジストリキーの参照

レジストリキーの値を参照します。先程作成したエントリの値を参照し、TextBoxコントロールに表示します。サブキーにはサブキーが含まれている可能性がありますので、再帰的にサブキーとそれに格納されているエントリの値を取得する GetRegistryText メソッドを作成します。

private string GetRegistryText(Microsoft.Win32.RegistryKey key)
{
  string text = string.Empty;

  // 引数で渡されたエントリの値を出力
  foreach (string valueName in key.GetValueNames())
  {
    text += string.Format("{0,-15}:{1}\r\n", 
      valueName, key.GetValue(valueName));
  }

  // 格納しているサブキーのエントリの値を出力
  foreach (string subKeyName in key.GetSubKeyNames())
  {
    using (RegistryKey subKey = key.OpenSubKey(subKeyName))
    {
      text += GetRegistryText(subKey);
    }
  }

  return text;
}

ButtonコントロールのClickイベントハンドラから、上記のGetRegistryTextメソッドを使ってエントリの値を取得しTextBoxコントロールに表示します。

private void button2_Click(object sender, EventArgs e)
{
  // HKEY_CURRENT_USER\RegApp を読み取り専用開きます
  using (Microsoft.Win32.RegistryKey reg = Registry.CurrentUser.OpenSubKey("RegApp"))
  {
    // エントリの値をテキストボックスに表示します
    textBox1.Text = GetRegistryText(reg);
  }
}

レジストリキーの削除

サブキーとエントリを削除します。OpenSubKeyメソッドの第二引数をTrueに設定することで、レジストリキーの書き換えを許可しエントリの削除を行います。

private void Button3_Click(System.Object sender, System.EventArgs e)
{
  // HKEY_CURRENT_USER\RegApp\Info のエントリ UserName のみを削除します
  using (Microsoft.Win32.RegistryKey regApp = Registry.CurrentUser.OpenSubKey("RegApp")) {
    using (Microsoft.Win32.RegistryKey info = regApp.OpenSubKey("Info")) {
      info.DeleteValue("UserName");
    }
  }
  
  // HKEY_CURRENT_USER\RegApp のサブキーツリーを削除します
  Registry.CurrentUser.DeleteSubKeyTree("RegApp");
}

.NET Compact Framework アプリケーションでは、任意のサブキーを削除する前に開いている全てのサブキー及びその子サブキーのインスタンスを明示的に閉じておく必要があります。

関連記事

Windows Mobile(.NET Compact Framework)を使ってアプリ開発する際に逆引きとしてお使いください。