Ich bekomme immer @error: 1
@extended: 1
ISt das so beabsichtigt?
Ich bekomme immer @error: 1
@extended: 1
ISt das so beabsichtigt?
Nein, das heißt, dass der memoryDLLCall nicht funktioniert...
Also muss schon davor, bei _ObjCoCreateInstance, oder _IMMDeviceEnumerator_GetDefaultAudioEndpoint oder _IMMDevice_Activate ein Fehler sein
Wie kann ich die abfangen?
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:
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
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?
mit den Slider-UDFs könnte was gehen
[autoit]_GUICtrlSlider_GetPos(
[/autoit]Oh Gott, dann muss ich mich wieder in die Tiefen der Hilfe reinknien
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)
gibt immer 0 zurück...
Warum
Edit: Sorry für den Doppelpost, bin aber eine Meldung gewohnt...
Vllt brauchst du ein WinWait nach dem Run?
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)
gibt 0 zurück... :wacko:
Du liest das Handle doch schon vor dem WinWait aus! Wie soll das gehen?
Danke! Jetzt funktionierts!
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)
Kann das jemand auf verschiedenen Betriebssystemen testen?
Zu 2.
#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)
Zu 1. Es gibt da doch sicher eine Checkbox, die man auslesen kann!?
So einfach ist das?
Danke
Funktioniert das auch unter XP?