Seite 1 von 2

sndvol32

Verfasst: 26.05.2007 21:01
von Andreas_S
Hi,

Also, ich kann mit

Code: Alles auswählen

RunProgram("sndvol32","","")
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 :lol: . 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 :mrgreen:

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?