Ir para o conteúdo

Criar, editar e eliminar chaves no registo do windows em Visual Basic 6.0

Este artigo irá explicar como manipular chaves no registo irei dar um exemplo de como bloquear e desbloquear o gestor de tarefas o que poderá ser bastante útil aos programadores que elaboram programas de gestão de utilizadores, este é um dos programas que podem de certa forma limitar os utilizadores a não terminarem determinados programas. Passarei em primeiro lugar á explicação do modRegisto.bas. Para começar, o leitor deve criar o módulo mais importante de todo o programa o modRegisto.bas que lhe permitirá aceder, editar, eliminar chaves no registo, como já tinha referido, para isso, abre um novo projecto standard EXE, clique com o botão direito no explorador de projecto, adicionar, módulo e coloque o seguinte código:

'Enumerações
Public Enum tClass
    HKEY_CLASSES_ROOT = &H80000000
    HKEY_CURRENT_USER = &H80000001
    HKEY_LOCAL_MACHINE = &H80000002
    HKEY_USERS = &H80000003
    HKEY_CURRENT_CONFIG = &H80000005
End Enum

O programa regedit do windows tem várias pastas e enumeração anterior indica os "endereços" dessas pastas, bem que esta enumeração poderia não existir era uma questão de colocarem os valores em constantes o que não é nada prático neste caso.

'Constantes
Public Const REG_DWORD = 4 'Tipo de chave
Public Const KEY_QUERY_VALUE = &H1
Public Const KEY_SET_VALUE = &H2
Public Const KEY_CREATE_SUB_KEY = &H4 'Permite criar subchaves
Public Const KEY_ENUMERATE_SUB_KEYS = &H8 'Permite enumerar subchaves
Public Const KEY_NOTIFY = &H10 'Autorização para alterar a notificação. 
Public Const READ_CONTROL = &H20000
Public Const SYNCHRONIZE = &H100000
Public Const STANDARD_RIGHTS_READ = (READ_CONTROL)
Public Const STANDARD_RIGHTS_WRITE = (READ_CONTROL)
Public Const STANDARD_RIGHTS_EXECUTE = (READ_CONTROL)
Public Const KEY_READ = ((STANDARD_RIGHTS_READ Or KEY_QUERY_VALUE Or KEY_ENUMERATE_SUB_KEYS Or KEY_NOTIFY) And (Not SYNCHRONIZE)) ' Permissões para a leitura da chave
Public Const KEY_WRITE = ((STANDARD_RIGHTS_WRITE Or KEY_SET_VALUE Or KEY_CREATE_SUB_KEY) And (Not SYNCHRONIZE)) ' Permissões para a escrita da chave

A nivel de constantes está incompleto e isto porque só vou referir um tipo de chave DWORD, poderia ter colocado aqui todas as constantes, mas para além de não serem necessárias iria aumentar em grande o número de linhas de código desnecessárias.

'Funções API
Public Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As Long
Public Declare Function RegCreateKey Lib "advapi32.dll" Alias "RegCreateKeyA" (ByVal hKey As Long, ByVal lpSubKey As String, phkResult As Long) As Long
Public Declare Function RegDeleteValue Lib "advapi32.dll" Alias "RegDeleteValueA" (ByVal hKey As Long, ByVal lpValueName As String) As Long
Public Declare Function RegOpenKeyEx Lib "advapi32.dll" Alias "RegOpenKeyExA" (ByVal hKey As Long, ByVal lpSubKey As String, ByVal ulOptions As Long, ByVal samDesired As Long, phkResult As Long) As Long
Public Declare Function RegQueryValueExA Lib "advapi32.dll" (ByVal hKey As Long, ByVal lpValueName As String, ByVal lpReserved As Long, lpType As Long, ByRef lpData As Long, lpcbData As Long) As Long
Public Declare Function RegSetValueEx Lib "advapi32.dll" Alias "RegSetValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal Reserved As Long, ByVal dwType As Long, lpData As Any, ByVal cbData As Long) As Long

RegCloseKey: Fecha uma chave de registo, deve ser colocada sempre que se lê, cria ou edita uma chave de registo.

  • hKey: chave de registo a fechar.

RegCreateKey: Cria uma chave de registo, se a chave já existe a função irá abrir a chave.

  • hKey: Indica a chave corrente ou um dos valores indicados na enumeração acima referida.
  • lpSubKey: Localização no registo a criar ou abrir.
  • phkResult: Variável para qual vai o resultado da função.

RegDeleteValue: Elimina uma chave de registo especificada, esta função não apaga chaves que têm sub-chaves.

  • hKey: Indica a chave corrente ou um dos valores indicados na enumeração acima referida.
  • lpValueName: Nome da chave a eliminar.

RegOpenKeyEx: Abre uma chave de registo do windows, permitindo assim a leitura, escrita ou eliminar uma chave de registo.

  • hKey: Indica a chave corrente ou um dos valores indicados na enumeração acima referida.
  • lpSubKey: Localização no registo a criar ou abrir.
  • ulOptions: Valores reservados. Deve definir a 0.
  • samDesired: Inserir um ou mais "flags" especificando assim o acesso pretendido de leitura ou escrita.
  • phkResult: Variável para qual vai o resultado da função.

RegQueryValueExA: Lê um valor do registo, pode-se ler alguns tipos de registo que neste caso será o DWORD como já tinha referido.

  • hKey: Resultado dado pela função RegOpenKeyEx.
  • lpValueName: Nome do registo a ler.
  • lpReserved: Valores reservados. Deve definir a 0.
  • lpType: Tipo de dados de registo.
  • lpData: Variável para qual vai o resultado da função.
  • lpcbData: Tamanho em bytes do resultado da função.

RegSetValueEx: Define um valor de uma chave.

  • hKey: Resultado dado pela função RegOpenKeyEx.
  • lpValueName: Nome do registo a ler.
  • lpReserved: Valores reservados. Deve definir a 0.
  • dwType: Tipo de dados de registo.
  • lpData: Variável para qual vai o resultado da função.
  • cbData: Tamanho em bytes do resultado da função.

Depois de uma breve descrição das funções API e os seus parâmetros vou apresentar as funções que usam as APIs para que se possa ler, escrever e eliminar as chaves no registo.

'Cria e edita uma chave de registo
Public Function CriarChave(hotKey As tClass, strPath As String, strValue As String, strData As Long)
Dim Ret 'Variável de resultados
'Criar a chave de registo
RegCreateKey hotKey, strPath, Ret
'Define o valor do registo que se pretende
RegSetValueEx Ret, strValue, 0, REG_DWORD, strData, 4
'Fecha o acesso á chave de registo
RegCloseKey Ret
End Function

'Lê uma chave de registo
Public Function LerChave(hotKey As tClass, strPath As String, strValueName As String)
Dim Ret, lData 'Variáveis de resultado
'Abertura da chave de registo
RegOpenKeyEx hotKey, strPath, 0, KEY_READ, Ret
'Consulta ao valor da chave de registo especificada
RegQueryValueExA Ret, strValueName, 0, REG_DWORD, lData, 4
'Fecha o acesso á chave de registo
RegCloseKey Ret
'Atribui á função o valor da chave consultada
LerChave = lData
End Function

'Elimina uma chave de registo
Public Function EliminarChave(hotKey As tClass, strPath As String, strValue As String)
Dim Ret 'Variável de resultado
'Abertura do registo para edição
RegCreateKey hotKey, strPath, Ret
'Elimina a chave de registo especificada
RegDeleteValue Ret, strValue
'Fecha o acesso á chave de registo
RegCloseKey Ret
End Function

Depois de ter dado uma breve abordagem ao modRegisto.bas vou passar a um exemplo de como bloquear e desbloquear o gestor de tarefas. O passo seguinte, criar um botão que irá dar a ordem ao programa para bloquear e desbloquear o gestor de tarefas, o nome deste controlo estará ao critério do programador. Quando o tiver criado, coloque o seguinte código:

Private Sub Command1_Click()
If LerChave(HKEY_CURRENT_USER, "Software\Microsoft\Windows\CurrentVersion\Policies\System", "disableTaskmgr") = 1 Then
    Command1.Caption = "Bloquear"
    CriarChave HKEY_CURRENT_USER, "Software\Microsoft\Windows\CurrentVersion\Policies\System", "disableTaskmgr", "0"
ElseIf LerChave(HKEY_CURRENT_USER, "Software\Microsoft\Windows\CurrentVersion\Policies\System", "disableTaskmgr") = 0 Then
        Command1.Caption = "Desbloquear"
        CriarChave HKEY_CURRENT_USER, "Software\Microsoft\Windows\CurrentVersion\Policies\System", "disableTaskmgr", "1"
End If
End Sub

Private Sub Form_Load()
If LerChave(HKEY_CURRENT_USER, "Software\Microsoft\Windows\CurrentVersion\Policies\System", "disableTaskmgr") = 1 Then
    Command1.Caption = "Desbloquear"
ElseIf LerChave(HKEY_CURRENT_USER, "Software\Microsoft\Windows\CurrentVersion\Policies\System", "disableTaskmgr") = 0 Then
        Command1.Caption = "Bloquear"
End If
End Sub

O primeiro passo que o programa faz é verificar se o valor da chave presente é 0 (Desbloqueado) ou 1 (Bloqueado) se está bloqueada então vai apresentar no texto do botão Desbloquear, caso seja 0 então o programa vai atribuir ao texto do botão Desbloquear, função Form_Load(). Quando o utilizador clica no botão o programa volta a verificar as condições do registo e edita a chave consoante o registo anterior, ou seja, se for 0 então atribui o valor 1 e vice-versa.

Importante: Os parametros das funções LerChave e CriarChave, ou seja, HKEY_CURRENT_USER, Software\Microsoft\Windows\CurrentVersion\Policies\System e disableTaskmgr são obrigatórios neste programa para que este de facto possa bloquear e desbloquear o gestor de tarefas correctamente.