C#

УЧЕБНЫЕ МАТЕРИАЛЫ ПО ПРОГРАММИРОВАНИЮ, КРЕКИНГУ, HTML, CSS, ОФИСНЫМ ПРИЛОЖЕНИЯМ

[Главная страница] [Контакты]

Программирование для Windows


Доступ к реестру

ЗАДАЧА
Сохранять параметры в реестре Windows и получать их оттуда.

РЕШЕНИЕ
Используйте классы Registry и RegistryKey из пространства имен Microsoft.Win32.

ОБСУЖДЕНИЕ
C# предоставляет неограниченный доступ к реестру Windows при помощи классов Registry и RegistryKey. Исходной точкой для доступа к реестру Windows служит класс Registry: он включает общие (public) поля, возвращающие объекты RegistryKey для путей реестра первого уровня (или базовых разделов реестра). Важнейшими являются два поля.

  • CurrentUser содержит предпочтения конкретного пользователя. Это поле, соответствующее в реестре базовому разделу HKEY_CURRENT_USER, используется для хранения данных реестра в приложении чаще всего.
  • LocalMachine содержит конфигурационные параметры, применяемые для всех пользователей данного компьютера. Как и путь установки, этот путь можно использовать для хранения специфической информации приложения. Это поле соответствует базовому разделу реестра HKEY_LOCAL_MACHINE.

После получения объекта RegistryKey вы можете, применив похожий на пути синтаксис, перейти на более глубокие вложенные уровни реестра и установить/получить отдельные ею параметры. Обычно приложения хранят параметры в подразделе \Software\CompanyName\ProductName или \Software\CompanyName\ProductName\Category базового раздела реестра. Чтобы получить объект RegistryKey для вложенного раздела реестра, вызовите метод RegistryKey.OpenSubKey. Для открытия раздела в режиме, допускающем запись, в метод OpenSubKey нужно передать необязательный параметр True:

RegistryKey Key;
Key = Registry.CurrentUser.OpenSubKey("Software\\MyCompany\\MyApp", true);

Для записи параметра в реестр применяется метод SetValue, а для получения — GetValue. Параметры реестра обычно извлекаются в форме строк:

string Value;

// Извлечение параметра MyValueName.
Value = (string)Key.GetValue("MyValueName");

// Сохранение параметра MyValueName.
Key.SetValue("MyValueName", Value);

Доступ приложения к реестру можно реализовать по-разному. Вы можете получать все параметры при запуске приложения и сохранять их при его закрытии или получать и сохранять параметры по требованию. В основе класса RegistryData лежит второй подход. При создании экземпляра класса (и раздела реестра при необходимости) он получает ссылку на указанный объект RegistrуКеу. Для извлечения параметров из реестра и их записи служат процедуры получения и установки свойства:

На форме создать кнопку.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace RegistryTestForm
{
    public partial class Form1 : Form
    {
        // Эта команда создает раздел реестра в случае надобности
        RegistryData RegistryData = new RegistryData();

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            OpenFileDialog dlgOpen = new OpenFileDialog();

            // Получение параметра реестра или пути по умолчанию
            dlgOpen.InitialDirectory = RegistryData.DefaultDocumentPath;

            // Отображение диалогового окна Open
            // с первоначальным каталогом по умолчанию.
            dlgOpen.ShowDialog();
            
            // Выбрано ли имя файла?
            if (dlgOpen.FileName == "")
            {
                // Была щелкнута кнопка Cancel. Ничего не делаем.
            }
            else
            {
                // В реестре сохраняется каталог, содержащий данный файл.
                RegistryData.DefaultDocumentPath = System.IO.Path.GetDirectoryName(dlgOpen.FileName);
                // (Теперь вы можете выполнять над файлом определенные действия.)
            }

        }
    }
}

В проекте создать новый класс RegistryData.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.Win32;
using System.Windows.Forms; // !!!

namespace RegistryTestForm
{
    class RegistryData
    {
        private RegistryKey Key;
        private const string RegistryPath = "Software\\TestCompany\\TestApp\\";

        public string DefaultDocumentPath
        {
            set
            {
                Key.SetValue("DefaultDocumentPath", value);
            }
            get
            {
                return (string)Key.GetValue("DefaultDocumentPath", Application.StartupPath);
            }
        }
        public RegistryData()
        {
            Key = Registry.CurrentUser.OpenSubKey(RegistryPath, true);
            if (Key == null)
            {
                // Раздел не существует. Выполняетсая его создание.
                Key = Registry.CurrentUser.CreateSubKey(RegistryPath);
            }
        }
    }
}

 

Используемая литература:

  1. Занимательное программирование на Bisual Basic.NET: Климов А.П.
  2. Программирование для Microsoft Windows на C#: Чарльз Петцольд.
  3. Рецепты программирования на Visual Basic.NET: Мэтью Макдональд.