Seite 1 von 2
sndvol32
Verfasst: 26.05.2007 21:01
von Andreas_S
Hi,
Also, ich kann mit
kann so ein Config-Fenster aufrufen, aber ist es auch möglich ohne diesem Fenster sowas zu konfiguieren?
Danke im voraus!
Verfasst: 26.05.2007 21:05
von RSBasic
http://www.purebasic.fr/german/viewtopi ... utst%E4rke
Aber ich weis net ob du so genau meinst, wie er es beschrieben hat.
Verfasst: 26.05.2007 21:14
von Andreas_S
Danke erstmal!
Leider ist es nicht das was ich meine, ich hab ja auch ungeschickt gefragt, ich meinte eher die Auswahl des Aufnahme-Geräts, weiß das jemand wie das geht?
Verfasst: 26.05.2007 23:05
von Andreas_S
Ich probiers mal auf die Russiche Methode:
Code: Alles auswählen
Global hook
Global hWnd
Global Quit
Procedure WinProc(nCode.l,wParam.l,lParam.l)
*mymsg.MSG=lParam
myRect.RECT
GetWindowRect_(*mymsg\hWnd,myRect.RECT)
Weite=myRect\right-myRect\left
Select *mymsg\message
Case #WM_CLOSE
Quit=1
CloseWindow_(hWnd)
EndSelect
ProcedureReturn CallNextHookEx_(hook,nCode,wParam,lParam)
EndProcedure
RunProgram("sndvol32","/record","")
While hWnd=0
hWnd=FindWindow_(0,"Aufnahme")
Delay(10)
Wend
hook=SetWindowsHookEx_(#WH_GETMESSAGE,@WinProc(),GetModuleHandle_(0),GetWindowThreadProcessId_(hWnd,0))
If hWnd
Repeat
Delay(1)
Until Quit=1
EndIf
Aber irgenwie will das programm den Hook nicht, weiß wer wiso?
Danke schonmal!
Verfasst: 26.05.2007 23:48
von Kiffi
Wieso willst Du das 'hooken'?
Wieso ist das eine russische Methode?
Verfasst: 26.05.2007 23:51
von Kaeru Gaman
lol... spielst du jetzt den hooker-könig?
warum schaust du nicht in die MSDN, mit welchen API-calls man den Mixer ansteuert?
ich bin überzeugt, dass es dafür befehle gibt, ist schließlich ein bestandteil des OS.
Verfasst: 26.05.2007 23:54
von Andreas_S
Kiffi hat geschrieben:Wieso ist das eine russische Methode?
Blackskyliner hat geschrieben:Dann Hookst du einfach das Fenster, setzt dann die Checkbox auf 1 und die andere auf 0 und dann machste das Fenster wieder zu

. Das wäre dann die russische Variante das zu machen was du willst

Kiffi hat geschrieben:Wieso willst Du das 'hooken'?
Hab keinen anderen ausweg gesehen ... bin ich blind?

.
//Edit:
Kaeru Gaman hat geschrieben:lol... spielst du jetzt den hooker-könig?
llllllllllllloooooooooolllllllllllllllll ..... nein
Ich schau mal in MSDN.
Verfasst: 27.05.2007 00:00
von ts-soft
Du kannst es ja mal mit der MCI-API versuchen, gibts auch eine MCI.hlp von
MS, bzw. PSDK ist Dein Freund. Weiß jetzt aber nicht ob da sowas bei ist.
Ansonsten gehts wohl per COM, was jetzt overdressed wäre

Verfasst: 27.05.2007 14:03
von Andreas_S
Ich hab da mal schnell ne Notlösung gemacht:
Code: Alles auswählen
Structure MIXERCONTROL
cbStruct.l
dwControlID.l
dwControlType.l
fdwControl.l
cMultipleItems.l
szShortName.b[#MIXER_SHORT_NAME_CHARS]
szName.b[#MIXER_LONG_NAME_CHARS]
lMinimum.l
lMaximum.l
dwMinimum.l
dwMaximum.l
Reserved.l[6]
cSteps.l
cbCustomData.l
dwReserved.l[6]
EndStructure
Procedure ASL_MixerGetRecordChannel(mixerID,*ChannelNumber)
mxl.MIXERLINE
mxl\cbStruct=SizeOf(MIXERLINE)
mxl\dwComponentType=#MIXERLINE_COMPONENTTYPE_DST_WAVEIN
Result=mixerGetLineInfo_(mixerID,mxl,#MIXER_GETLINEINFOF_COMPONENTTYPE)
mxlctrls.MIXERLINECONTROLS
mxlctrls\cbStruct=SizeOf(MIXERLINECONTROLS)
mxlctrls\dwLineID=mxl\dwLineID
mxlctrls\cControls=mxl\cControls
mxlctrls\dwControlType=#MIXERCONTROL_CONTROLTYPE_MUX
mxlctrls\cbmxctrl=SizeOf(MIXERCONTROL)
Bytes=(SizeOf(MIXERCONTROL)* mxlctrls\cControls)
*control=AllocateMemory(Bytes)
mxlctrls\pamxctrl=*control
Result=mixerGetLineControls_(mixerID,mxlctrls,#MIXER_GETLINECONTROLSF_ONEBYTYPE)
CopyMemory(*Control,ctrl.Mixercontrol,SizeOf(Mixercontrol))
For i=0 To mxl\cControls-1
CopyMemory(*Control+(i*SizeOf(Mixercontrol)),ctrl.Mixercontrol,SizeOf(Mixercontrol))
Next
If ctrl\dwControlType=#MIXERCONTROL_CONTROLTYPE_MUX
mcd.MIXERCONTROLDETAILS
mcd\cbStruct = SizeOf(MIXERCONTROLDETAILS)
mcd\cChannels=1
PokeL(mcd+12,ctrl\cMultipleItems)
mcd\cbDetails = SizeOf(MIXERCONTROLDETAILS_BOOLEAN)
*lv=AllocateMemory(mcd\cChannels*ctrl\cMultipleItems*mcd\cbDetails)
mcd\paDetails=*lv
Result=mixerGetControlDetails_(mixer,mcd,#MIXER_GETCONTROLDETAILSF_VALUE)
For i=0 To ctrl\cMultipleItems-1
If PeekL(*lv+i*4)=1
NumberSelect=i
EndIf
Next
NameSelect.s=s$
PokeL(*ChannelNumber,NumberSelect)
ProcedureReturn #True
EndIf
ProcedureReturn #False
EndProcedure
Procedure KillProcess(PID)
#PROCESS_TERMINATE=$1
#PROCESS_CREATE_THREAD=$2
#PROCESS_VM_OPERATION=$8
#PROCESS_VM_READ=$10
#PROCESS_VM_WRITE=$20
#PROCESS_DUP_HANDLE=$40
#PROCESS_CREATE_PROCESS=$80
#PROCESS_SET_QUOTA=$100
#PROCESS_SET_INFORMATION=$200
#PROCESS_QUERY_INFORMATION=$400
#PROCESS_ALL_ACCESS=#STANDARD_RIGHTS_REQUIRED|#SYNCHRONIZE|$FFF
result=#False
phandle=OpenProcess_(#PROCESS_TERMINATE,#True,PID)
If phandle <> #Null
If TerminateProcess_(phandle,1)
result=#True
EndIf
CloseHandle_(phandle)
EndIf
ProcedureReturn result
EndProcedure
Procedure Kill_Prozess_by_Name(ProcName.s)
PID.l=0
#TH32CS_SNAPHEAPLIST=$1
#TH32CS_SNAPPROCESS=$2
#TH32CS_SNAPTHREAD=$4
#TH32CS_SNAPMODULE=$8
#TH32CS_SNAPALL=#TH32CS_SNAPHEAPLIST|#TH32CS_SNAPPROCESS|#TH32CS_SNAPTHREAD|#TH32CS_SNAPMODULE
#TH32CS_INHERIT=$80000000
#INVALID_HANDLE_VALUE=-1
#Process32lib=9999
NewList Process32.PROCESSENTRY32()
Global Proc32.PROCESSENTRY32
If OpenLibrary(#Process32Lib,"kernel32.dll")
snap=CallFunction(#Process32lib,"CreateToolhelp32Snapshot",#TH32CS_SNAPPROCESS,0)
If snap
DefType.Processentry32
Proc32\dwSize=SizeOf(Processentry32)
If CallFunction(#Process32lib,"Process32First",snap,@Proc32)
AddElement(Process32())
CopyMemory(@Proc32,@Process32(),SizeOf(Processentry32))
While CallFunction(#Process32lib,"Process32Next",snap,@Proc32)
AddElement(Process32())
CopyMemory(@Proc32,@Process32(),SizeOf(Processentry32))
Wend
EndIf
CloseHandle_(snap)
EndIf
CloseLibrary(#Process32lib)
EndIf
ResetList(Process32())
While NextElement(Process32())
If UCase(ProcName.s)=UCase(PeekS(@Process32()\szExeFile))
PID=PeekL(@Process32()\th32ProcessID)
EndIf
Wend
If PID>1
If KillProcess(PID)
ProcedureReturn #True
EndIf
EndIf
ProcedureReturn #False
EndProcedure
Procedure SetMixerTo(State)
ASL_MixerGetRecordChannel(0,@ChannelNumber)
If ChannelNumber<>State
prog=RunProgram("sndvol32","/record","")
While hWnd=0
Delay(100)
hWnd=FindWindow_(0,"Aufnahme")
Wend
keybd_event_(18,0,0,0)
keybd_event_(18,0,#KEYEVENTF_KEYUP,0)
keybd_event_(65,0,0,0)
keybd_event_(65,0,#KEYEVENTF_KEYUP,0)
While ChannelNumber<>State
keybd_event_(65,0,0,0)
keybd_event_(65,0,#KEYEVENTF_KEYUP,0)
keybd_event_(32,0,0,0)
keybd_event_(32,0,#KEYEVENTF_KEYUP,0)
Delay(1)
ASL_MixerGetRecordChannel(0,@ChannelNumber)
Wend
Kill_Prozess_by_Name("SNDVOL32.EXE")
EndIf
EndProcedure
SetMixerTo(1)
@ts-soft
Unter den begriffen find ich nichts im Google.
Verfasst: 28.05.2007 21:48
von Andreas_S
Ich hab jetzt die direkte Prozedure geproggt:
Code: Alles auswählen
Procedure ASL_MixerGetRecordChannel(mixerID,*ChannelNumber)
Structure MIXERCONTROL
cbStruct.l
dwControlID.l
dwControlType.l
fdwControl.l
cMultipleItems.l
szShortName.b[#MIXER_SHORT_NAME_CHARS]
szName.b[#MIXER_LONG_NAME_CHARS]
lMinimum.l
lMaximum.l
dwMinimum.l
dwMaximum.l
Reserved.l[6]
cSteps.l
cbCustomData.l
dwReserved.l[6]
EndStructure
mxl.MIXERLINE
mxl\cbStruct=SizeOf(MIXERLINE)
mxl\dwComponentType=#MIXERLINE_COMPONENTTYPE_DST_WAVEIN
Result=mixerGetLineInfo_(mixerID,mxl,#MIXER_GETLINEINFOF_COMPONENTTYPE)
mxlctrls.MIXERLINECONTROLS
mxlctrls\cbStruct=SizeOf(MIXERLINECONTROLS)
mxlctrls\dwLineID=mxl\dwLineID
mxlctrls\cControls=mxl\cControls
mxlctrls\dwControlType=#MIXERCONTROL_CONTROLTYPE_MUX
mxlctrls\cbmxctrl=SizeOf(MIXERCONTROL)
Bytes=(SizeOf(MIXERCONTROL)* mxlctrls\cControls)
*control=AllocateMemory(Bytes)
mxlctrls\pamxctrl=*control
Result=mixerGetLineControls_(mixerID,mxlctrls,#MIXER_GETLINECONTROLSF_ONEBYTYPE)
CopyMemory(*Control,ctrl.Mixercontrol,SizeOf(Mixercontrol))
For i=0 To mxl\cControls-1
CopyMemory(*Control+(i*SizeOf(Mixercontrol)),ctrl.Mixercontrol,SizeOf(Mixercontrol))
Next
If ctrl\dwControlType=#MIXERCONTROL_CONTROLTYPE_MUX
mcd.MIXERCONTROLDETAILS
mcd\cbStruct = SizeOf(MIXERCONTROLDETAILS)
mcd\cChannels=1
PokeL(mcd+12,ctrl\cMultipleItems)
mcd\cbDetails = SizeOf(MIXERCONTROLDETAILS_BOOLEAN)
*lv=AllocateMemory(mcd\cChannels*ctrl\cMultipleItems*mcd\cbDetails)
mcd\paDetails=*lv
Result=mixerGetControlDetails_(mixer,mcd,#MIXER_GETCONTROLDETAILSF_VALUE)
For i=0 To ctrl\cMultipleItems-1
If PeekL(*lv+i*4)=1
NumberSelect=i
EndIf
Next
NameSelect.s=s$
PokeL(*ChannelNumber,NumberSelect)
ProcedureReturn #True
EndIf
ProcedureReturn #False
EndProcedure
Procedure ASL_MixerSetRecordChannel(mixerID,State)
mxl.MIXERLINE
mxl\cbStruct=SizeOf(MIXERLINE)
mxl\dwComponentType=#MIXERLINE_COMPONENTTYPE_DST_WAVEIN
Result=mixerGetLineInfo_(mixerID,mxl,#MIXER_GETLINEINFOF_COMPONENTTYPE)
mxlctrls.MIXERLINECONTROLS
mxlctrls\cbStruct=SizeOf(MIXERLINECONTROLS)
mxlctrls\dwLineID=mxl\dwLineID
mxlctrls\cControls=mxl\cControls
mxlctrls\dwControlType=#MIXERCONTROL_CONTROLTYPE_MUX
mxlctrls\cbmxctrl=SizeOf(MIXERCONTROL)
Bytes=(SizeOf(MIXERCONTROL)* mxlctrls\cControls)
*control=AllocateMemory(Bytes)
mxlctrls\pamxctrl=*control
Result=mixerGetLineControls_(mixerID,mxlctrls,#MIXER_GETLINECONTROLSF_ONEBYTYPE)
CopyMemory(*Control,ctrl.Mixercontrol,SizeOf(Mixercontrol))
For i=0 To mxl\cControls-1
CopyMemory(*Control+(i*SizeOf(Mixercontrol)),ctrl.Mixercontrol,SizeOf(Mixercontrol))
Next
If ctrl\dwControlType=#MIXERCONTROL_CONTROLTYPE_MUX
mcd.MIXERCONTROLDETAILS
mcd\cbStruct=SizeOf(MIXERCONTROLDETAILS)
mcd\cChannels=1
PokeL(mcd+12,ctrl\cMultipleItems)
mcd\cbDetails=SizeOf(MIXERCONTROLDETAILS_BOOLEAN)
*lv=AllocateMemory(mcd\cChannels*ctrl\cMultipleItems*mcd\cbDetails)
PokeL(*lv+State*4,1)
mcd\paDetails=*lv
Result=mixerSetControlDetails_(mixerID,mcd,#MIXER_SETCONTROLDETAILSF_VALUE)
ProcedureReturn #True
EndIf
ProcedureReturn #False
EndProcedure
ASL_MixerSetRecordChannel(0,3)
RunProgram("sndvol32","/record","",#PB_Program_Wait)
ASL_MixerGetRecordChannel(0,@ChannelNumber)
Debug ChannelNumber
Die eigendliche Procedure ist ASL_MixerSetRecordChannel(). Es ist schon oft gefragt worden wie das geht, soll ich das in jeden Thread schreiben wo das vorkam?