![]() |
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:
SetValue(String, String, Object)
SetValue(String, String, Object, RegistryValueKind)
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.
GetValue(String, String, Object)
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 |
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
//Se existir retorna os valores armazenados 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 private void Form1_FormClosing(object sender, FormClosingEventArgs e) |
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:
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
Referências: