2014-03-26 125 views
0

我有一个恼人的问题。 我正在尝试使用RegDeleteKey值API删除注册表值(无我的名字空间),但只做了一处修改。 我希望函数有一个绝对路径作为参数。 因此,像这样:注册表删除值

RegDeleteKeyValue("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run","myValue") 

大气压它看起来像这样(这一件作品,但没有绝对路径作为参数,如它应该是):

Private Enum RegHive 
     HKEY_CLASSES_ROOT = &H80000000 
     HKEY_CURRENT_USER = &H80000001 
     HKEY_LOCAL_MACHINE = &H80000002 
     HKEY_USERS = &H80000003 
     HKEY_CURRENT_CONFIG = &H80000005 
    End Enum 

RegDeleteKeyValue(Reghive.HKEY_CURRENT_USER,"Software\Microsoft\Windows\CurrentVersion\Run","Myvalue") 

我试了一下修改像这样的函数,所以参数将只是绝对路径和注册表值。

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 
    DeleteReyKeyValue("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run", "123") 
End Sub 

Public Shared Function DeleteReyKeyValue(ByVal Key As String, ByVal valueName As String) As Long 
    Dim Handle As IntPtr 
    Dim Hive As String = Split(Key, "\")(0) 
    Select Case Hive 
     Case "HKEY_CLASSES_ROOT" 
      Handle = CType(&H80000000, IntPtr) 
     Case "HKEY_CURRENT_USER" 
      Handle = CType(&H80000001, IntPtr) 
     Case "HKEY_LOCAL_MACHINE" 
      Handle = CType(&H80000002, IntPtr) 
     Case "HKEY_USERS" 
      Handle = CType(&H80000003, IntPtr) 
     Case "HKEY_CURRENT_CONFIG" 
      Handle = CType(&H80000005, IntPtr) 
    End Select 
    Key = Key.Replace(Hive, String.Empty) 
    Return RegDeleteKeyValue(Handle, Key, valueName) 
End Function 

<DllImport("advapi32.dll")> _ 
Private Shared Function RegDeleteKeyValue(ByVal handle As IntPtr, ByVal keyName As String, ByVal valueName As String) As Long 
End Function 

当使用这个,没有任何反应,没有错误,但注册表值不会被删除? ; O 这是为什么?

回答

1

的问题已经回答计算器

所以删除你的价值,你应该使用这个代码,

string keyName = @"Software\Microsoft\Windows\CurrentVersion\Run"; 
using (RegistryKey key = Registry.CurrentUser.OpenSubKey(keyName, true)) 
{ 
    if (key == null) 
    { 
     // Key doesn't exist. Do whatever you want to handle 
     // this case 
    } 
    else 
    { 
     key.DeleteValue("123"); 
    } 
} 

这会删除注册表中的值。我不确定你为什么要添加这样复杂的代码。 下面是MSDN的链接:http://social.msdn.microsoft.com/Forums/vstudio/en-US/5b22e94c-37a9-4be5-ad55-3d9229220194/how-to-use-add-read-change-delete-registry-keys-with-vbnet?forum=vbgeneral

它有VB代码,但它仍然是几乎为C#一样的,你可以使用一个在线转换器的代码转换,http://converter.telerik.com/

0

感谢您的快速回复。 在这种情况下,一个朋友帮助我,代码现在正在工作。 我只是缺少一个+ “\” 这现在工作:

Public Shared Function DeleteReyKeyValue(ByVal Key As String, ByVal valueName As String) As Long 
    Dim Handle As IntPtr 
    Dim Hive As String = Split(Key, "\")(0) 
    MsgBox("Hive:" & Hive) 
    Select Case Hive 
     Case "HKEY_CLASSES_ROOT" 
      Handle = CType(&H80000000, IntPtr) 
     Case "HKEY_CURRENT_USER" 
      Handle = CType(&H80000001, IntPtr) 
     Case "HKEY_LOCAL_MACHINE" 
      Handle = CType(&H80000002, IntPtr) 
     Case "HKEY_USERS" 
      Handle = CType(&H80000003, IntPtr) 
     Case "HKEY_CURRENT_CONFIG" 
      Handle = CType(&H80000005, IntPtr) 
    End Select 
    Key = Key.Replace(Hive + "\", String.Empty) 
    Return RegDeleteKeyValue(Handle, Key, valueName) 
End Function 
<DllImport("advapi32.dll")> _ 
Private Shared Function RegDeleteKeyValue(ByVal handle As IntPtr, ByVal keyName As String, ByVal valueName As String) As Long 
End Function 

学分:罗津