alle Registrywerte unterhalb eines schlüssels lesen?

  • ich möchte ein tool schreiben, das mir

    1. die sounddevices aus der registry liest
    2. deren status ausliest (standard oder nicht)


    ich weiss wo die registyschlüssel sind:
    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\MMDevices\Audio\Render

    dort verstecken sie sich in den langen zahlen Kolonen
    ich habe auch herausgefunden das :
    "DeviceState" 1 besagt das dieses gerät sichtbar und nicht deaktiviert ist.
    Role:0 Role:1 Role:2 den die art der verwendung angibt .

    im darunterliegenden schlüssel ist der wert von "{a45c254e-df1c-4efd-8020-67d146a850e0},2" der name des gerätes.

    nun will ich meinen soundchanger dahingehend umbaue, das er

    1. die sounddevices aus der registry liest
    2. deren status ausliest (standard oder nicht)
    3. die devices im tray anzeigen
    4. im tray den eintrag disabled der eh schon an ist
    5. den regeintrag schreibt wie er sein soll.


    problem dabei ist, das die zahlenkolonen bei allen unterschiedlich sind und ich nun einen weg brauche dennoch die richtigen geräte zu finden.
    das auslesen der einzelnen werte nach den zahlenkolonen ist simpel
    im tray den disablen ist dann auch simpel
    den regeintrag schreiben dann auch.

    bleibt also nur die frage wie ich den ganzen bereich auslese
    das aussieben anhand von "DeviceState" ist dann schon wieder einfach.


    hier mein bisheriges script (dem einen oder anderen mag es in teilen bekannt vorkommen)

    Spoiler anzeigen
    [autoit]

    #Include <Constants.au3>
    Opt("TrayMenuMode",3)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    $hdmi = TrayCreateItem("HDMI")
    $real = TrayCreateItem("Soundkarte")
    $head = TrayCreateItem("Headset")
    TrayCreateItem("")
    $exititem = TrayCreateItem("Beenden")

    [/autoit] [autoit][/autoit] [autoit]

    TraySetState()
    TraySetClick(1)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    While 1
    $msg = TrayGetMsg()
    Select
    Case $msg = $hdmi
    Run("control mmsys.cpl,@0,0")
    ;~ ;warten bis das Fenster geöffnet wurde
    WinWaitActive("Sound")
    $a="HDMI ist nun an"
    Send("{DOWN 1}")
    ; Zur Schaltfläche "Als Standard"
    Send("{TAB 2}")
    Send("{ENTER}")
    Send("{ENTER}")
    TrayTip("Sounddevice", ""&$a, 5, 1)
    TrayItemSetState ($hdmi,$TRAY_DISABLE)
    TrayItemSetState ($real,$TRAY_ENABLE)
    TrayItemSetState ($head,$TRAY_ENABLE)
    Sleep(3000)
    Case $msg = $real
    Run("control mmsys.cpl,@0,0")
    ;~ ;warten bis das Fenster geöffnet wurde
    WinWaitActive("Sound")
    $a="Soundkarte ist nun an"
    Send("{DOWN 2}")
    ; Zur Schaltfläche "Als Standard"
    Send("{TAB 2}")
    Send("{ENTER}")
    Send("{ENTER}")
    TrayTip("Sounddevice", ""&$a, 5, 1)
    TrayItemSetState ($hdmi,$TRAY_ENABLE)
    TrayItemSetState ($real,$TRAY_DISABLE)
    TrayItemSetState ($head,$TRAY_ENABLE)
    Sleep(3000)
    Case $msg = $head
    Run("control mmsys.cpl,@0,0")
    ;~ ;warten bis das Fenster geöffnet wurde
    WinWaitActive("Sound")
    $a="Headset ist nun an"
    Send("{DOWN 3}")
    ; Zur Schaltfläche "Als Standard"
    Send("{TAB 2}")
    Send("{ENTER}")
    Send("{ENTER}")
    TrayTip("Sounddevice", ""&$a, 5, 1)
    TrayItemSetState ($hdmi,$TRAY_ENABLE)
    TrayItemSetState ($real,$TRAY_ENABLE)
    TrayItemSetState ($head,$TRAY_DISABLE)
    Sleep(3000)
    Case $msg = $exititem
    ExitLoop
    EndSelect
    WEnd

    [/autoit]


    ideen bitte zu mir :)

    I spent 10 minutes reviewing code and thinking "What kind of drugs is this guy on?" before realizing it was something I wrote.

    2 Mal editiert, zuletzt von Maximus1 (1. Februar 2012 um 08:49)

  • Keine registry aber ...

    Spoiler anzeigen
    [autoit]

    ; Generated by AutoIt Scriptomatic

    [/autoit] [autoit][/autoit] [autoit]

    $wbemFlagReturnImmediately = 0x10
    $wbemFlagForwardOnly = 0x20
    $colItems = ""
    $strComputer = "localhost"

    [/autoit] [autoit][/autoit] [autoit]

    $Output = ""
    $Output &= "Computer: " & $strComputer & @CRLF
    $Output &= "==========================================" & @CRLF
    $objWMIService = ObjGet("winmgmts:\\" & $strComputer & "\root\CIMV2")
    $colItems = $objWMIService.ExecQuery("SELECT * FROM Win32_SoundDevice", "WQL", _
    $wbemFlagReturnImmediately + $wbemFlagForwardOnly)

    [/autoit] [autoit][/autoit] [autoit]

    If IsObj($colItems) Then
    For $objItem In $colItems
    $Output &= "Availability: " & $objItem.Availability & @CRLF
    $Output &= "Caption: " & $objItem.Caption & @CRLF
    $Output &= "ConfigManagerErrorCode: " & $objItem.ConfigManagerErrorCode & @CRLF
    $Output &= "ConfigManagerUserConfig: " & $objItem.ConfigManagerUserConfig & @CRLF
    $Output &= "CreationClassName: " & $objItem.CreationClassName & @CRLF
    $Output &= "Description: " & $objItem.Description & @CRLF
    $Output &= "DeviceID: " & $objItem.DeviceID & @CRLF
    $Output &= "DMABufferSize: " & $objItem.DMABufferSize & @CRLF
    $Output &= "ErrorCleared: " & $objItem.ErrorCleared & @CRLF
    $Output &= "ErrorDescription: " & $objItem.ErrorDescription & @CRLF
    $Output &= "InstallDate: " & WMIDateStringToDate($objItem.InstallDate) & @CRLF
    $Output &= "LastErrorCode: " & $objItem.LastErrorCode & @CRLF
    $Output &= "Manufacturer: " & $objItem.Manufacturer & @CRLF
    $Output &= "MPU401Address: " & $objItem.MPU401Address & @CRLF
    $Output &= "Name: " & $objItem.Name & @CRLF
    $Output &= "PNPDeviceID: " & $objItem.PNPDeviceID & @CRLF
    $strPowerManagementCapabilities = $objItem.PowerManagementCapabilities(0)
    $Output &= "PowerManagementCapabilities: " & $strPowerManagementCapabilities & @CRLF
    $Output &= "PowerManagementSupported: " & $objItem.PowerManagementSupported & @CRLF
    $Output &= "ProductName: " & $objItem.ProductName & @CRLF
    $Output &= "Status: " & $objItem.Status & @CRLF
    $Output &= "StatusInfo: " & $objItem.StatusInfo & @CRLF
    $Output &= "SystemCreationClassName: " & $objItem.SystemCreationClassName & @CRLF
    $Output &= "SystemName: " & $objItem.SystemName & @CRLF
    If MsgBox(1, "WMI Output", $Output) = 2 Then ExitLoop
    $Output = ""
    Next
    Else
    MsgBox(0, "WMI Output", "No WMI Objects Found for class: " & "Win32_SoundDevice")
    EndIf

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func WMIDateStringToDate($dtmDate)
    Return (StringMid($dtmDate, 5, 2) & "/" & _
    StringMid($dtmDate, 7, 2) & "/" & StringLeft($dtmDate, 4) _
    & " " & StringMid($dtmDate, 9, 2) & ":" & StringMid($dtmDate, 11, 2) & ":" & StringMid($dtmDate, 13, 2))
    EndFunc ;==>WMIDateStringToDate

    [/autoit]


    http://msdn.microsoft.com/en-us/library/…3(v=vs.85).aspx

  • ich habe mir erstmal so beholfen, da ich mit WMI nicht wirklich was anfangen kann.
    zur ausführung des scripts braucht ihr noch das tool hier
    http://zornsoftware.talsit.info/free-downloads?did=14
    das stellt anhand der GUID das jeweilig gewollte ein.
    ich wollte das zwar selber machen, aber warum das rad neu erfinden, wenn MS sich mit der API sowieso so geheimnsvoll anstellt
    http://social.microsoft.com/Forums/en/Offt…e9-2af63fd4a13e


    Spoiler anzeigen
    [autoit]


    #Include <Constants.au3>
    #include <Array.au3>
    Opt("TrayMenuMode",3)

    [/autoit] [autoit][/autoit] [autoit]

    Local $reg[1]
    Local $devnamen[1]
    Local $blase = 1

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    If @CPUArch = "X64" Then ; wenn x64 dann nimm den 64er regschlüssel
    Global $key = "HKEY_LOCAL_MACHINE64\SOFTWARE\Microsoft\Windows\CurrentVersion\MMDevices\Audio\Render"
    Else
    Global $key = "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\MMDevices\Audio\Render"
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 1 To 20
    Local $var = RegEnumKey($key, $i)
    If @error <> 0 Then ExitLoop
    $devices = RegRead($key&"\"&$var, "DeviceState") ; status des gerätes (nutzbar?!?)
    if $devices = 1 Then ; wenn nutzbar dann steht da eine 1, also nimm das mit auf
    $devname = RegRead($key&"\"&$var&"\"&"Properties", "{b3f8fa53-0004-438e-9003-51a46e139bfc},6") ; name des gerätes
    _ArrayAdd($reg,$var) ; regschlüssel
    _ArrayAdd($devnamen,$devname) ; gerätenamen
    EndIf
    Next
    _ArrayDelete($devnamen,0)
    _ArrayDelete($reg,0)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ;~ $menge = _ArraySize( $reg ) ; einträge im array
    ;~ for $j = 1 to $menge
    ;~ TrayCreateItem($devnamen[$j])
    ;~ Next

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    $hdmi = TrayCreateItem($devnamen[0])
    $real = TrayCreateItem($devnamen[1])
    $head = TrayCreateItem($devnamen[2])
    TrayCreateItem("")
    $noblase = TrayCreateItem("Kein Traytip")
    TrayCreateItem("")
    $exititem = TrayCreateItem("Beenden")

    [/autoit] [autoit][/autoit] [autoit]

    TraySetState()
    TraySetClick(1)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    While 1
    $msg = TrayGetMsg()
    Select
    Case $msg = $hdmi
    Run("SetDefaultAudioDevice.exe"&" "&$reg[0]&" "& "communications","",@SW_HIDE )
    Run("SetDefaultAudioDevice.exe"&" "&$reg[0]&" "& "multimedia","",@SW_HIDE )
    If $blase = 1 Then TrayTip("Sounddevice", ""&$devnamen[0], 5, 1)
    TrayItemSetState ($hdmi,$TRAY_DISABLE)
    TrayItemSetState ($real,$TRAY_ENABLE)
    TrayItemSetState ($head,$TRAY_ENABLE)
    Sleep(3000)
    Case $msg = $real
    Run("SetDefaultAudioDevice.exe"&" "&$reg[1]&" "& "communications","",@SW_HIDE )
    Run("SetDefaultAudioDevice.exe"&" "&$reg[1]&" "& "multimedia","",@SW_HIDE )
    If $blase = 1 Then TrayTip("Sounddevice", ""&$devnamen[1], 5, 1)
    TrayItemSetState ($hdmi,$TRAY_ENABLE)
    TrayItemSetState ($real,$TRAY_DISABLE)
    TrayItemSetState ($head,$TRAY_ENABLE)
    Sleep(3000)
    Case $msg = $head
    Run("SetDefaultAudioDevice.exe"&" "&$reg[2]&" "& "communications","",@SW_HIDE )
    Run("SetDefaultAudioDevice.exe"&" "&$reg[2]&" "& "multimedia","",@SW_HIDE )
    If $blase = 1 Then TrayTip("Sounddevice", ""&$devnamen[2], 5, 1)
    TrayItemSetState ($hdmi,$TRAY_ENABLE)
    TrayItemSetState ($real,$TRAY_ENABLE)
    TrayItemSetState ($head,$TRAY_DISABLE)
    Sleep(3000)
    Case $msg = $noblase
    If $blase = 1 Then
    $blase = 0
    Else
    $blase = 1
    TrayTip("", "Traytips werden wieder angezeigt", 5, 1)
    EndIf
    Case $msg = $exititem
    ExitLoop
    EndSelect
    WEnd

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ;~ Func _ArraySize( $reg )
    ;~ SetError( 0 )
    ;~ $index = 0
    ;~ Do
    ;~ $pop = _ArrayPop( $reg )
    ;~ $index = $index + 1
    ;~ Until @error = 1
    ;~ Return $index - 1
    ;~ EndFunc

    [/autoit] [autoit][/autoit] [autoit][/autoit]

    wie man im code sehen kann, soll hier noch nicht ende sein. ich würde gern für jedes gefundene gerät automatisch einen trayeintrag mit den richtigen infos erstellen lassen.
    wenn man mehr oder ewniger als meine 3 sounddevices hat kann es zu problemen kommen. das möchte ich damit dann beheben.

    würde mich freuen, wenn jemand einen heissen tip für mich hat wo ich mal schauen sollte.

    I spent 10 minutes reviewing code and thinking "What kind of drugs is this guy on?" before realizing it was something I wrote.

  • Moin, also du musst dann deine TrayItems in einer Schleife erzeugen in etwa so

    Spoiler anzeigen
    [autoit]


    Local $aTrayitems[1]
    For $i = 1 To Ubound($aArray)-1
    _ArrayAdd($aTrayitems,'')
    $aTrayitems[$i] = TrayCreateItem("Name aus dem Anderen Array")
    Next

    [/autoit]

    dass spätere Abfragen wird mit einer Case nicht so einfach möglich sein da du nicht in einer Schleife deine Cases abfragen kannst aber du kannst zb $aTrayItems[1] To $aTrayitems[Ubound($aTrayitems)-1] sollte gehen :P d.h. du musst dann innerhalb deiner Case abfangen welcher Eintrag gedrückt wurde und daraufhin dann eine Aktion ausführen

    Gruß Marvin