C# -  Trabalhando com o Registro do Windows
 Hoje veremos como trabalhar com o registro do Windows usando C#.


O Registro do Windows é um banco de dados que armazena informações referentes ao seu computador de forma hierárquica.

Neste artigo veremos como trabalhar com o Registro abordando conceitos básicos de como o Registro funciona e, em seguida, mostraremos como usar a classe Registry para adicionar, atualizar ou excluir valores/chaves do Registro via código.
 

O que é o Registro do Windows ?
 

No sistema operacional Windows, o Registro representa um banco de dados hierárquico composto de chaves, subchaves, chaves predefinidas, hives e entradas de valor usadas para armazenar dados específicos de um sistema ou aplicativo. Você pode usar o Registro do Windows para salvar os detalhes de configuração do seu aplicativo para que possa acessá-los mais tarde, se necessário.

 

Para visualizar o Registro do Windows basta acionar o Editor de Registro :

 


 

O Registro do Windows foi introduzido pela primeira vez no Windows 95 e foi incluído em todas as versões subsequentes do Windows. É um componente crítico do seu sistema operacional e, se ficar corrompido, seu sistema pode ficar instável ou até mesmo inutilizável. Por esse motivo, é importante fazer backup de seu Registro regularmente. (aviso dado)


Anatomia do Registro

 

Sendo um banco de dados hierárquico o Registro contém informações relativas ao sistema operacional, como hardware, software e preferências do usuário do computador, sendo usado pelo sistema operacional e aplicativos para armazenar dados de configuração. A estrutura de chave do Registro se assemelha a uma árvore de diretórios do sistema de arquivos na qual cada nó pode conter um valor ou outra subchave.

O Registro é dividido em cinco seções principais: HKEY_LOCAL_MACHINE, HKEY_CURRENT_CONFIG, HKEY_CLASSES_ROOT, HKEY_USERS e HKEY_CURRENT_USER.

 

Cada seção contém diferentes tipos de dados.

HKEY_CLASSES_ROOT: armazena informações sobre aplicativos registrados, incluindo associações de arquivos e definições de classe de objeto OLE.

HKEY_CURRENT_USER: Armazena as configurações do usuário atual. É aqui que a maioria das configurações do aplicativo são armazenadas.

HKEY_LOCAL_MACHINE: armazena as configurações que se aplicam a todos os usuários na máquina, como aplicativos instalados e drivers de dispositivo.

HKEY_USERS: Armazena as configurações de todos os usuários na máquina. Isso é usado principalmente por administradores de sistema.

HKEY_CURRENT_CONFIG: contém informações relacionadas à configuração de hardware atual. Isso é usado principalmente por administradores de sistema.

 

A linguagem C# oferece suporte para trabalhar com o Registro do Windows por meio do namespace Microsoft.Win32.

 

A classe Registry é o principal ponto de entrada para interagir com o registro e contém métodos estáticos para leitura e gravação no registro, bem como uma propriedade estática que dá acesso a um objeto RegistryKey representando o perfil do usuário atual podendo ser usada para criar, abrir e fechar chaves no Registro.

Você pode adicionar, editar e excluir chaves e subchaves e também pode ler, adicionar e excluir valores do registro. Analogamente a uma pasta e subpastas dentro de uma pasta, um registro pode ter chaves e subchaves.

 

A seguir veremos como operar com o registro usando o C#,

 

Acessando o registro : definindo e recuperando valores

Podemos usar a classe Registry que fornece objetos RegistryKey que representam as chaves raiz no registro do Windows e métodos estáticos para acessar pares chave/valor.

 

O método SetValue define o valor de um par nome/valor em uma chave do Registro e possui duas sobrecargas:

O método GetValue recupera o valor associado ao nome especificado, na chave de registro especificada. Se o nome não for encontrado na chave especificada, retornará um valor padrão que você fornecer ou null se a chave especificada não existir.

Vamos usar estes dois métodos para atribuir valores e recuperar valores do registro.

 

1- Armazenando dados no Registro

Para armazenar quaisquer dados no Registro, precisamos acessar uma subchave de um dos elementos raiz predefinidos. Isso é feito chamando o método estático CreateSubKey da classe Registry que retornará o objeto RegistryKey com o qual podemos manipulá-lo.

Depois, podemos armazenar quantos valores quisermos na subchave chamando o método SetValue que recebe os 2 argumentos, name como uma string e value como um objeto.

 

using Microsoft.Win32;

RegistryKey key = Registry.CurrentUser.CreateSubKey(@"SOFTWARE\Valores");

//armazenando os valores
key.SetValue("Valor1", "Definindo valor 1");
key.SetValue("Valor2", "Definindo valor 2");

key.Close();

Abrindo o registro podemos conferir:

Não há necessidade de verificar se a subchave já existe ou não, o método CreateSubKey o cria ou abre o existente.

2- Retornando dados no Registro

Para recuperar quaisquer dados do Registro, é usado o método estático OpenSubKey da classe Registry que retorna uma instância RegistryKey da subchave fornecida.

Se o objeto não for null (caso a subchave fornecida não exista), podemos começar a recuperar os valores chamando o método GetValue que recebe apenas um argumento, o nome da chave.

using Microsoft.Win32;

//abrindo uma subkey 
RegistryKey key = Registry.CurrentUser.OpenSubKey(@"SOFTWARE\Valores");

//Se existir retorna os valores armazenados
if (key != null)
{
    Console.WriteLine(key.GetValue("Valor1"));
    Console.WriteLine(key.GetValue("Valor2"));
    key.Close();
}

Console.ReadLine();

Executando o código acima iremos recuperar os valores armazenados:

Usando o Registro do Windows em um exemplo real

No exemplo a seguir, usaremos o Registro para armazenar algumas configurações específicas do usuário. Mais especificamente, armazenaremos o tamanho da janela do aplicativo e o recuperaremos na próxima vez que o aplicativo for iniciado.

Como usamos a subchave CurrentUser, permitiremos que cada usuário tenha seu próprio tamanho de janela com base em suas preferências (neste caso, o tamanho da janela quando o aplicativo foi fechado).

Assim vamos criar um projeto usando o template Windows Forms App no VS 2022 no ambiente do .NET 6.

No formulário form1 vamos incluir uma Label definindo o seu nome como lblTexto e atribuindo um valor para o tamanho da fonte e uma cor :

A seguir, precisamos armazenar as configurações. Faremos isso no evento Closing do formulário, pois melhor atende às nossas necessidades.

using Microsoft.Win32;

namespace WinForms_Registro;

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_FormClosing(object sender, FormClosingEventArgs e)
    {
        RegistryKey key = Registry.CurrentUser.CreateSubKey(@"SOFTWARE\WinRegistry");
        key.SetValue("Width", this.Width);
        key.SetValue("Height", this.Height);
        key.Close();
    }
}

A seguir a próxima etapa é recuperar os valores armazenados quando o aplicativo for iniciado. Para isso, utilizamos o evento Load do formulário.

private void Form1_Load(object sender, EventArgs e)
    {
        RegistryKey key = Registry.CurrentUser.OpenSubKey(@"SOFTWARE\WinRegistry");
        if (key != null)
        {
            int width = int.Parse(key.GetValue("Width").ToString());
            int height = int.Parse(key.GetValue("Height").ToString());
            this.Size = new Size(width, height);
        }

         ExibeDados();
    }

Note que estamos invocando o método ExibeDados() que iremos definir mais adiante.

Vamos usar também o evento Resize do formulário para toda vez que o formulário for redimensionado invocar o método que vai exibir os valores armazenados e recuperados do registro na Label lblTexto:

 private void Form1_Resize(object sender, EventArgs e)
 {
        ExibeDados();
 }

Abaixo temos o código do método ExibeDados :

 private void ExibeDados()
 {
      lblTexto.Text = "Largura/Altura : "
+ this.Width + " / " + this.Height;
 }

Agora vamos executar o projeto e verificar o resultado:

Redimensionando o formulário teremos o resultado :

Como fazer backup e restaurar o registro

Para fazer backup do Registro do Windows, você tem duas opções: usar a classe Registry ou a API WINREG.

Usaremos a classe Registry aqui. Para fazer backup do registro, você pode usar o método ExportRegistryTree.

Esse método usa dois parâmetros:

  1. A chave para exportar
  2. O nome do arquivo para o qual exportar.

O trecho de código a seguir ilustra como ele pode ser usado:

Registry.ExportRegistryTree(Registry.LocalMachine, "backup.reg");

Isso exportará todo o registro para o arquivo backup.reg. Você também pode especificar uma chave específica para exportar, conforme mostrado no snippet de código abaixo:

Registry.ExportRegistryTree(Registry.CurrentUser, "backup.reg");

Para restaurar o registro cujo backup foi feito anteriormente, você pode usar o seguinte snippet de código:

Registry.ImportRegistryFile("backup.reg", true);

Isso importará todo o registro do arquivo backup.reg, substituindo todas as chaves existentes. Você também pode especificar uma chave específica para importar, assim:

Registry.ImportRegistryFile("backup.reg", Registry.CurrentUser, true);

Isso importará todo o registro do arquivo backup.reg, substituindo todas as chaves existentes.

Com isso temos uma visão geral de como trabalhar com o registro do Windows usando C#. 

Apenas tome cuidado ao trabalhar com chaves e valores do Registro, pois a exclusão ou modificação acidental pode levar a sérios problemas em seu computador que executa o sistema operacional Windows.

Pegue o projeto aqui:  RegistroWin.zip

"Já vos não chamarei servos, porque o servo não sabe o que faz o seu senhor; mas tenho-vos chamado amigos, porque tudo quanto ouvi de meu Pai vos tenho feito conhecer."
João 15:15

Porque um menino nos nasceu, um filho se nos deu, e o principado está sobre os seus ombros, e se chamará o seu nome: Maravilhoso, Conselheiro, Deus Forte, Pai da Eternidade, Príncipe da Paz.

Isaías 9:6
Porque um menino nos nasceu, um filho se nos deu, e o principado está sobre os seus ombros, e se chamará o seu nome: Maravilhoso, Conselheiro, Deus Forte, Pai da Eternidade, Príncipe da Paz.

Isaías 9:6

Referências:


José Carlos Macoratti