La Web del Programador: Comunidad de Programadores
 
    Pregunta:  41555 - MANIPULAR REGISTRO
Autor:  Janet marquet
Como podria manipular el registro de windows para añadir una clave en HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run]?
Es para que el programa se ejecute siempre al iniciar windows.

Gracias

  Respuesta:  E-Mondo .
1ª PARTE
En un modulo pegar este código tal y como está:

' Este modulo es la forma basica de usar el registro
' de Windows, pero se puede implementar para:
'
' - Obtener valores binarios
' - Obtener un valor si la clave existe
'-------------------------------------------------------------
' Formato del Editor del Registro (Regedit)
'
' Mi PC
' +__ HKEY_LOCAL_MACHINE
' +___ Software
' +___ Microsoft /
' +___ Windows | BootCount "3"
' +___ CurrentVersion --| BPC_Region "1"
' | ConfigPath "C:\WINDOWS\Config"
' \
'
' Clave: HKEY_LOCAL_MACHINE
' Subclave: Software; Microsoft; Windows; CurrentVersion
' Entrada: BootCount; BPC_Region; ConfigPath
' Valor: "3"; "1"; "C:\WINDOWS\Config"

Dim Ret As Long 'Valor de retorno para todos procedimientos
Const REG_SZ = 1

' Claves principales de Regedit (Solo lectura)
Public Const HKEY_CLASSES_ROOT = &H80000000
Public Const HKEY_CURRENT_USER = &H80000001
Public Const HKEY_LOCAL_MACHINE = &H80000002
Public Const HKEY_USERS = &H80000003
Public Const HKEY_PERFORMANCE_DATA = &H80000004
Public Const HKEY_CURRENT_CONFIG = &H80000005
Public Const HKEY_DYN_DATA = &H80000006

Public Const HKEY1 = &H80000000
Public Const HKEY2 = &H80000001
Public Const HKEY3 = &H80000002
Public Const HKEY4 = &H80000003
Public Const HKEY5 = &H80000004
Public Const HKEY6 = &H80000005
Public Const HKEY7 = &H80000006

'Declaraciones API para acceder al registro
Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As Long
Declare Function RegCreateKey Lib "advapi32.dll" Alias "RegCreateKeyA" (ByVal hKey As Long, ByVal lpSubKey As String, phkResult As Long) As Long
Declare Function RegDeleteValue Lib "advapi32.dll" Alias "RegDeleteValueA" (ByVal hKey As Long, ByVal lpValueName As String) As Long
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
Declare Function RegDeleteKey Lib "advapi32.dll" Alias "RegDeleteKeyA" (ByVal hKey As Long, ByVal lpSubKey As String) As Long
Declare Function RegQueryValueEx Lib "advapi32.dll" Alias "RegQueryValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal lpReserved As Long, lpType As Long, lpData As Any, lpcbData As Long) As Long
Declare Function RegOpenKey Lib "advapi32.dll" Alias "RegOpenKeyA" (ByVal hKey As Long, ByVal lpSubKey As String, phkResult As Long) As Long

  Respuesta:  E-Mondo em
He puesto parte de un codigo para manipular el registro pero no he visto que salga, asi que lo pongo entero, si se corta, mandame un mail y lo mando. Un saludo.

Copia a partir de esta linea y pega el codigo en un modulo.

' Este modulo es la forma basica de usar el registro
' de Windows, pero se puede implementar para:
'
' - Obtener valores binarios
' - Obtener un valor si la clave existe
'-------------------------------------------------------------
' Formato del Editor del Registro (Regedit)
'
' Mi PC
' +__ HKEY_LOCAL_MACHINE
' +___ Software
' +___ Microsoft /
' +___ Windows | BootCount "3"
' +___ CurrentVersion --| BPC_Region "1"
' | ConfigPath "C:\WINDOWS\Config"
' \
'
' Clave: HKEY_LOCAL_MACHINE
' Subclave: Software; Microsoft; Windows; CurrentVersion
' Entrada: BootCount; BPC_Region; ConfigPath
' Valor: "3"; "1"; "C:\WINDOWS\Config"

Dim Ret As Long 'Valor de retorno para todos procedimientos
Const REG_SZ = 1

' Claves principales de Regedit (Solo lectura)
Public Const HKEY_CLASSES_ROOT = &H80000000
Public Const HKEY_CURRENT_USER = &H80000001
Public Const HKEY_LOCAL_MACHINE = &H80000002
Public Const HKEY_USERS = &H80000003
Public Const HKEY_PERFORMANCE_DATA = &H80000004
Public Const HKEY_CURRENT_CONFIG = &H80000005
Public Const HKEY_DYN_DATA = &H80000006

Public Const HKEY1 = &H80000000
Public Const HKEY2 = &H80000001
Public Const HKEY3 = &H80000002
Public Const HKEY4 = &H80000003
Public Const HKEY5 = &H80000004
Public Const HKEY6 = &H80000005
Public Const HKEY7 = &H80000006

'Declaraciones API para acceder al registro
Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As Long
Declare Function RegCreateKey Lib "advapi32.dll" Alias "RegCreateKeyA" (ByVal hKey As Long, ByVal lpSubKey As String, phkResult As Long) As Long
Declare Function RegDeleteValue Lib "advapi32.dll" Alias "RegDeleteValueA" (ByVal hKey As Long, ByVal lpValueName As String) As Long
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
Declare Function RegDeleteKey Lib "advapi32.dll" Alias "RegDeleteKeyA" (ByVal hKey As Long, ByVal lpSubKey As String) As Long
Declare Function RegQueryValueEx Lib "advapi32.dll" Alias "RegQueryValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal lpReserved As Long, lpType As Long, lpData As Any, lpcbData As Long) As Long
Declare Function RegOpenKey Lib "advapi32.dll" Alias "RegOpenKeyA" (ByVal hKey As Long, ByVal lpSubKey As String, phkResult As Long) As Long

Public Sub SaveValueKey(hKey As Long, strPath As String, strName As String, Optional strValue As String)
' Guarda el nombre de una clave, subclave, entrada y valor.
'
' SaveValueKey HKEY_LOCAL_MACHINE, "E-Mondo", "Number Version", "2.60"
'_________________________________________________________________________________
'
' Guarda el nombre de una clave, subclave y entrada sin valor.
'
' SaveValueKey HKEY_LOCAL_MACHINE, "E-Mondo", "Number Version", ""
'_________________________________________________________________________________
'
' Crea una subclave dentro de una clave existente.
'
' SaveValueKey HKEY_LOCAL_MACHINE, "Software\E-Mondo", "Number Version", "2.60"
'_________________________________________________________________________________
'
' Crea una subclave dentro de la clave (En el ejemplo se crea con valor).
'
' SaveValueKey HKEY_LOCAL_MACHINE, "E-Mondo\Help", "HelpPath", "C:\E-Mondo\Help"
'_________________________________________________________________________________
'
' Crea una clave con valor en la entrada denominada "(Predeterminado)".
'
' SaveValueKey HKEY_LOCAL_MACHINE, "E-Mondo", "", "Modulo VB"
' SaveValueKey HKEY_LOCAL_MACHINE, "E-Mondo\Help", "", "Modulo VB"
'_________________________________________________________________________________

RegCreateKey hKey, strPath, Ret
RegSetValueEx Ret, strName, 0, REG_SZ, ByVal strValue, Len(strValue)
RegCloseKey Ret
End Sub

Public Sub DelValueKey(hKey As Long, strPath As String, strName As String)

' Elimina el valor de una entrada o nombre de la clave.
' Con esto se consigue que el valor sea una cadena vacia.
'
' DelValueKey HKEY_LOCAL_MACHINE, "E-Mondo", "Number Version"
'_________________________________________________________________________________

RegCreateKey hKey, strPath, Ret
RegDeleteValue Ret, strName
RegCloseKey Ret
End Sub

Public Sub DelKey(hKey As Long, hSubKey As String)

' Elimina un subclave de una clave (con todos los valores incluidos).
'
' DelKey HKEY_LOCAL_MACHINE, "E-Mondo\Help"
'_________________________________________________________________________________
'
' Elimina una clave (y todas las subclaves y valores que contenga).
'
' DelKey HKEY_LOCAL_MACHINE, "E-Mondo"
'_________________________________________________________________________________

RegCreateKey hKey, strPath, Ret
RegDeleteKey Ret, hSubKey
RegCloseKey Ret
End Sub

Public Function GetValueKey(hKey As Long, strPath As String, strName As String) As Variant

' Obtiene el valor de una entrada de una clave. (Modo de uso).
'
' Dim Variable As String
' Variable = GetValueKey(HKEY_LOCAL_MACHINE, "E-Mondo", "Number Version")
'
' [Variable contendria: "2.60"]
'_________________________________________________________________________________
'
' Obtener el valor de una entrada de una subclave de otra subclave.
'
' Dim Variable As String
' Variable = GetValueKey(HKEY_LOCAL_MACHINE, "E-Mondo\Help", "HelpPath")
'
' [Variable contendria: "C:\E-Mondo\Help"]
'_________________________________________________________________________________
'
' Todas las claves tienen un valor por defecto identificado como: (Predeterminado),
' pero es posible que no tenga valor y viene dado como: (valor no establecido)
' Pero en ocasiones si tienen valor, pero no se puede dirigir a él
' como si fuera una entrada de clave normal.
'
' Para obtener dicho valor escribir lo siguiente:
'
' Dim Variable As String
' Variable = GetValueKey(HKEY_LOCAL_MACHINE, "Clave", "")
'
' Poniendo "", recoge el valor que tenga (Predeterminado) de la clave,
' ya tenga o no tenga valor.
'_________________________________________________________________________________

Dim strValue As String
Dim lngLen As Long
Dim lngType As Long
Dim Key As Long
Dim X As Long
X = RegOpenKey(hKey, strPath, Key)
strValue = Space$(256)
lngLen = Len(strValue)
X = RegQueryValueEx(Key, strName, 0, lngType, ByVal strValue, lngLen)
If X = 0 And lngType = REG_SZ And lngLen > 1 Then
strValue = Left$(strValue, lngLen - 1)
Else
strValue = ""
End If
GetValueKey = strValue
X = RegCloseKey(Key)
End Function