Aktuelles Volume auch unter Vista abfragen

  • Nein, das heißt, dass der memoryDLLCall nicht funktioniert...
    Also muss schon davor, bei _ObjCoCreateInstance, oder _IMMDeviceEnumerator_GetDefaultAudioEndpoint oder _IMMDevice_Activate ein Fehler sein :(

  • Mach doch mal nach jeder Funktion eine MessageBox, die Rückgabe, @error und @extended anzeigt und sag mir dann, bei welcher Funktion als erstes welcher Fehler auftritt.

  • So ich mach mal eine Art Tabelle:

    Funktion/@error/@extended
    _ObjCoInitialize()/0/0
    _ObjCoCreateInstance($CLSID_MMDeviceEnumerator, $IID_IMMDeviceEnumerator, $IMMDeviceEnumerator_vTable)/0/0
    _IMMDeviceEnumerator_GetDefaultAudioEndpoint($objDeviceEnumerator, $eRender, $eConsole)/1/1
    _IUnknown_Release($objDeviceEnumerator)/1/0
    _IMMDevice_Activate($objDefaultDevice, $IID_IAudioEndpointVolume, $CLSCTX_INPROC_SERVER)/1/1
    _ObjCreateFromPtr($pIAudioEndpointVolume, $IAudioEndpointVolume_vTable)/1/0
    _IUnknown_Release($objDefaultDevice)/1/0

  • Und nochmal. Hab in der DLLStruct ein Semikolon vergessen... idiotischer Fehler ;(
    Und ich kanns nicht austeseten, VirtualBox bekommt nicht genug RAM für Win7. :(

  • Und wieder @error und @extendet auf 1 :(

    Woran kann das liegen?
    Achso, welches ist denn der Pfad zu dem kleinem Mixer?

    Hier noch mal die Tabelle:
    0/0
    0/0
    1/1
    1/0
    1/1
    1/0
    1/0

  • Den Pfad zum Mixer in Vista kenne ich leider nicht.
    Zum testen kannst du ja noch die Funktion austauschen:

    [autoit]

    Func _IMMDeviceEnumerator_GetDefaultAudioEndpoint(ByRef $deviceEnumerator, $dataFlow, $role)
    ; Prog@ndy
    Local $result = _ObjFuncCall($HRESULT, $deviceEnumerator, "GetDefaultAudioEndpoint" , "dword", $dataFlow, "dword", $role, "ptr*",0)
    If @error Then
    MsgBox(0, '', "_ObjFuncCall in GetDefaultAudioEndpoint" & @CRLF & "@error: " & @error & @CRLF & "@extended: " & @extended & @CRLF & $result )
    MsgBox(0, '', "$deviceEnumerator" & @CRLF & $deviceEnumerator[0]& @CRLF & isDLLStruct($deviceEnumerator[1]) & @CRLF & DLLStructGetData($deviceEnumerator[2], "GetDefaultAudioEndpoint") )
    Return SetError(1,1,0)
    EndIf
    If $result[0] <>0 Then Return SetError($result[0],2,0)
    Local $objDefaultDevice = _ObjCreateFromPtr($result[4], $IMMDevice_vTable)
    Return SetError(@error,0,$objDefaultDevice)
    EndFunc

    [/autoit]
  • Das bringt leider auch nur im ersten Durchgang 0 Fehler bis dann @error 3 @extended -1 kommt und danach startet sich das Programm neu (Warum ?( ) und es kommt wieder die gleiche Aufteilung...

  • Dass ObjFuncCall den Fehler 3 mit extended 1 hat, sagt, dass der Pointer zu der Funktion 0 ist. Frag mich aber nicht, warum :(
    Damit weiß ich leider nicht mehr weiter. Ohne Vista ist das einfach zu doof...
    und warum sich das neustartet, weiß ich auch nicht.

  • Ich habe den Mixer gefunden!
    Er befindet sich im System32 Ordner unter sndvol.exe

    Lässt sich da was machen? Bzw. Klar lässt sich da was machen, aber wie lese ich einen Slider aus? ControlGetText?

  • Oh Gott, dann muss ich mich wieder in die Tiefen der Hilfe reinknien :D

    Ok, aber geht das auch für Controls (Ich meine _GUI...() )

  • Dieser Code hier:

    [autoit]

    #include <GuiSlider.au3>
    Run(@SystemDir & "\SndVol.exe")
    $handel = ControlGetHandle("Lautstärkemixer", "", "[CLASS:msctls_trackbar32; INSTANCE:1]")
    $Pos = _GUICtrlSlider_GetPos($handel)
    MsgBox(0, "Lautstärke", $Pos)

    [/autoit]

    gibt immer 0 zurück... :(
    Warum ?(
    Edit: Sorry für den Doppelpost, bin aber eine Meldung gewohnt... :rolleyes:

  • Selbst

    [autoit]

    #include <GuiSlider.au3>
    Run(@SystemDir & "\SndVol.exe")
    $handel = ControlGetHandle("Lautstärkemixer", "", "[CLASS:msctls_trackbar32; INSTANCE:1]")
    WinWait("Lautstärkemixer")
    Sleep(1000)
    $Pos = _GUICtrlSlider_GetPos($handel)
    MsgBox(0, "Lautstärke", $Pos)

    [/autoit]


    gibt 0 zurück... :wacko:

  • Danke! Jetzt funktionierts! :D
    Aber wie finde ich 1. heraus, ob Mute ist, 2. wie funktioniert es mit @SW_HIDE?

    Also mein Code wäre jetzt:

    [autoit]

    #include <GuiSlider.au3>
    Run(@SystemDir & "\SndVol.exe")
    WinWait("Lautstärkemixer")
    $handel = ControlGetHandle("Lautstärkemixer", "", "[CLASS:msctls_trackbar32; INSTANCE:1]")
    $Pos = _GUICtrlSlider_GetPos($handel)
    MsgBox(0, "Lautstärke", $Pos)

    [/autoit]

    Kann das jemand auf verschiedenen Betriebssystemen testen?

  • Zu 2.

    Spoiler anzeigen
    [autoit]

    #include <GuiSlider.au3>
    Run(@SystemDir & "\SndVol.exe", "", @SW_HIDE)
    WinWait("Lautstärkemixer")
    $handel = ControlGetHandle("Lautstärkemixer", "", "[CLASS:msctls_trackbar32; INSTANCE:1]")
    $Pos = _GUICtrlSlider_GetPos($handel)
    WinClose("Lautstärkemixer")
    MsgBox(0, "Lautstärke", $Pos)

    [/autoit]


    Zu 1. Es gibt da doch sicher eine Checkbox, die man auslesen kann!?