ListView Adee ... ListBox Juhuuuuuu

olek

Mitglied
Servus @ all

Kämpfe die ganze Zeit damit meine ausgelesene Hardware die in einem Listview ausgegebn wird nun in einer Listbox auszugeben! Was muss ich in meinem Code alles verändern

PLS HELP

THX olek

' Deklarationen
blablabla ....

' Wert eines Eintrags ermitteln (String)
Private Function GetValueStr(ByVal DevicePath As String, ByVal Value As String) As String

Dim hKey As Long, TmpStr As String * 256

' Schlüssel öffnen
Call RegOpenKeyEx(HKEY_LOCAL_MACHINE, DevicePath, 0&, KEY_READ, hKey)
If hKey <> 0 Then

' Eintrag lesen
Call RegQueryValueEx(hKey, Value, 0&, REG_SZ, ByVal TmpStr, 256)
GetValueStr = Left$(TmpStr, InStr(1, TmpStr, vbNullChar) - 1)
RegCloseKey hKey
End If

End Function

' Wert eines Eintrags ermitteln (Long)
Private Function GetValueLng(ByVal DevicePath As String, ByVal Value As String) As Long

Dim hKey As Long, TmpLng As Long

' Schlüssel öffnen
Call RegOpenKeyEx(HKEY_LOCAL_MACHINE, DevicePath, 0&, KEY_READ, hKey)
If hKey <> 0 Then

' Eintrag lesen
Call RegQueryValueEx(hKey, Value, 0&, REG_SZ, TmpLng, 4)
GetValueLng = TmpLng
RegCloseKey hKey
End If

End Function

' Enumerieren aller installierten Geräte
Public Function EnumConntectedDevices()

Dim hKey As Long, TmpStr As String * 256, RegClass As String * 256, i As Integer, Retval As Long

' Schlüssel der installierten Hardwareklassen öffnen
Call RegOpenKeyEx(HKEY_LOCAL_MACHINE, DevClassPath, 0&, KEY_ENUMERATE_SUB_KEYS, hKey)
If hKey <> 0 Then
Do
' Hardwareklassen Enumerieren
Retval = RegEnumKeyEx(hKey, i, TmpStr, Len(TmpStr), ByVal 0&, RegClass, Len(RegClass), ByVal 0&)
If Retval <> 0 Then
Exit Do
End If
i = i + 1

' Hardwaregeräte Enumerieren
Call EnumDevices(DevClassPath & Left$(TmpStr, InStr(1, TmpStr, vbNullChar) - 1) & "\")
Loop
RegCloseKey hKey
End If

End Function

' Geräte einer Klasse Enumerieren
Private Function EnumDevices(ByVal DevicePath As String)

Dim hKey As Long, TmpStr As String * 256, RegClass As String * 256, i As Integer, Retval As Long

' Schlüssel der Geräte öffnen
Call RegOpenKeyEx(HKEY_LOCAL_MACHINE, DevicePath, 0&, KEY_ENUMERATE_SUB_KEYS Or KEY_READ, hKey)
If hKey <> 0 Then
Do
' Geräte der Hardwareklasse Enumerieren
Retval = RegEnumKeyEx(hKey, i, TmpStr, Len(TmpStr), ByVal 0&, RegClass, Len(RegClass), ByVal 0&)
If Retval <> 0 Then
Exit Do
End If
i = i + 1

' Emulierte Netzwekgeräte filtern
If Right$(DevicePath, 39) = "{ad498944-762f-11d0-8dcb-00c04fc3358c}\" Then
If UCase(Left$(TmpStr, 8)) <> "##?#ROOT" And UCase(Left$(TmpStr, 6)) <> "##?#SW" Then
Call EnumSubDevices(DevicePath & Left$(TmpStr, InStr(1, TmpStr, vbNullChar) - 1) & "\")
End If
Else
Call EnumSubDevices(DevicePath & Left$(TmpStr, InStr(1, TmpStr, vbNullChar) - 1) & "\")
End If
Loop
RegCloseKey hKey
End If

End Function

' Instanzen der selben Hardware Enumerieren (z.B. Wave & Midi einer Soundkarte)
Private Function EnumSubDevices(ByVal DevicePath As String)

Dim hKey As Long, TmpStr As String * 256, RegClass As String * 256, i As Integer, Retval As Long
Dim DevInstance As String, DevDesc As String, LI As ListItem, DExist As Boolean, j As Integer

Call RegOpenKeyEx(HKEY_LOCAL_MACHINE, DevicePath, 0&, KEY_ENUMERATE_SUB_KEYS Or KEY_READ, hKey)

For i = 0 To GetValueLng(DevicePath & "Control\", "ReferenceCount")
' Untergerät ermitteln
Retval = RegEnumKeyEx(hKey, i, TmpStr, Len(TmpStr), ByVal 0&, RegClass, Len(RegClass), ByVal 0&)

' Gerät angeschlossen?
If GetValueLng(DevicePath & Left$(TmpStr, InStr(1, TmpStr, vbNullChar) - 1) & "\Control\", "Linked") = 1 Then
' DeviceInstance Pfad ermitteln
DevInstance = GetValueStr(DevicePath, "DeviceInstance")
DevDesc = GetValueStr(EnumPath & DevInstance & "\", "DeviceDesc")
If DevDesc = "" Then DevDesc = GetValueStr(EnumPath & DevInstance & "\", "DeviceDesc")

' Doppelte Einträge?
DExist = False
For j = 1 To ListView1.ListItems.Count
If ListView1.ListItems(j).SubItems(1) = DevInstance Then DExist = True
Next j

' Doppelte, Storage, System und SW Geräte wollen wir nicht!
If Not DExist And UCase(Left$(DevInstance, 2)) <> "SW" And UCase(Left$(DevInstance, 7)) <> "STORAGE" And _
UCase(GetValueStr(EnumPath & GetValueStr(DevicePath, "DeviceInstance"), "Class")) <> "SYSTEM" Then
Set LI = ListView1.ListItems.Add(, , DevDesc)
LI.SubItems(1) = DevInstance
End If
End If
Next i
RegCloseKey hKey

End Function

' Beim Laden der Form die Geräte finden
Private Sub Form_Load()

With ListView1

EnumConntectedDevices

Dim Filenum As Integer
Dim j As Integer

Filenum = FreeFile
Open "C:\hardware.txt" For Output As #Filenum
For j = 1 To ListView1.ListItems.Count
Print #Filenum, ListView1.ListItems(j).Text
Next j
Close #Filenum

End With
End Sub
 

Neue Beiträge

Zurück