我只是想簡單檢查一下注冊表位置是否存在,并且此處其他問題的答案不起作用。這是我的代碼。我有一個 ON 的標簽和一個 OFF 的標??簽,它們只是找到或沒有找到條目。我有注冊表項,但沒有讓標簽翻轉。FriendlyName 是 7&639dc5f&0&0000 中的一個鍵。
Private Sub CheckUSB_Serial()
If My.Computer.Registry.GetValue("HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USB\VID_04E2&PID_1422&MI_00\7&639dc5f&0&0000", _
"FriendlyName", Nothing) Is Nothing Then
USB_SERIAL_ON.Visible = False
USB_SERIAL_OFF.Visible = True
Else
USB_SERIAL_ON.Visible = True
USB_SERIAL_OFF.Visible = False
End If
End Sub
uj5u.com熱心網友回復:
從 .NET Framework 4(我相信)開始,RegistryKey.OpenBaseKey可用,它允許指定一個Registry View。當一個應用程式以 32 位運行時,這在嘗試讀取 64 位作業系統上的 64 位注冊表時特別有用。它適用于 32 位和 64 位作業系統。RegistryKey.OpenSubKey與 RegistryKey.OpenBaseKey 結合使用。
根據檔案,OpenSubKey如果操作失敗,則回傳 null (Nothing)。它還引發了以下例外:
- ArguementNullException
- ObjectDisposedException
- 安全例外
因此,如果嘗試打開注冊表子項并且值為 null(Nothing),則該項不存在。
嘗試以下操作:
添加以下匯入陳述句
Imports Microsoft.Win32
子鍵存在:
Public Function SubkeyExists(hive As RegistryHive, subkey As String, Optional regView As RegistryView = RegistryView.Registry64) As Boolean
'open specified registry hive with specified RegistryView
Using rKey As RegistryKey = RegistryKey.OpenBaseKey(hive, regView)
If rKey IsNot Nothing Then
Using sKey As RegistryKey = rKey.OpenSubKey(subkey, False)
If sKey IsNot Nothing Then
Return True
Else
Return False
End If
End Using
Else
Throw New Exception($"Error (SubkeyExists) - Could Not open '{hive.ToString()}' ")
End If
End Using
End Function
用法:
Dim result As Boolean = SubkeyExists(RegistryHive.LocalMachine, "SYSTEM\CurrentControlSet\Enum\USB\VID_04E2&PID_1422&MI_00\7&639dc5f&0&0000")
'Dim result As Boolean = SubkeyExists(RegistryHive.LocalMachine, "SYSTEM\CurrentControlSet\Enum\USB\VID_04E2&PID_1422&MI_00\7&639dc5f&0&0000", RegistryView.Default)
或者,可以使用遞回來檢查注冊表子項的每個部分是否存在(從左到右)。
要從指定子鍵中的 ValueName 獲取值,可以使用以下命令:
獲取注冊表值:
Public Function GetRegistryValue(hive As RegistryHive, subkey As String, valueName As String, Optional regView As RegistryView = RegistryView.Registry64) As Object
Using rKey As RegistryKey = RegistryKey.OpenBaseKey(hive, regView)
If rKey IsNot Nothing Then
'open subkey
Using sKey As RegistryKey = rKey.OpenSubKey(subkey, False)
If sKey IsNot Nothing Then
'read from registry
'Debug.WriteLine($"'{valueName}' Data Type: {sKey.GetValueKind(valueName)}")
Return sKey.GetValue(valueName)
Else
Throw New Exception($"Error (GetRegistryValue) - Could not open '{subkey}'")
End If
End Using
Else
Throw New Exception($"Error (GetRegistryValue) - Could Not open '{hive.ToString()}' ")
End If
End Using
End Function
用法
Dim result As String = CType(GetRegistryValue(RegistryHive.LocalMachine, "SYSTEM\CurrentControlSet\Enum\USB\VID_04E2&PID_1422&MI_00\7&639dc5f&0&0000", "FriendlyName"), String)
uj5u.com熱心網友回復:
謝謝大家的幫助。這是我最終使用的代碼,它可以滿足我的需要:
Imports Microsoft.Win32
Private Sub CheckUSB_Serial()
Dim RegVersion As Microsoft.Win32.RegistryKey
Dim KeyValue = "SYSTEM\\CurrentControlSet\\Enum\\USB\\VID_04E2&PID_1422&MI_00\\7&639dc5f&0&0000"
RegVersion = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(KeyValue, False)
If RegVersion IsNot Nothing Then
USB_SERIAL_ON.Visible = True
USB_SERIAL_OFF.Visible = False
RegVersion.Close()
End If
If RegVersion Is Nothing Then
USB_SERIAL_ON.Visible = False
USB_SERIAL_OFF.Visible = True
RegVersion.Close()
End If
End Sub
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/493972.html
