sndvol32

Anfängerfragen zum Programmieren mit PureBasic.
Andreas_S
Beiträge: 787
Registriert: 14.04.2007 16:48
Wohnort: Wien Umgebung
Kontaktdaten:

sndvol32

Beitrag 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!
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Beitrag von RSBasic »

http://www.purebasic.fr/german/viewtopi ... utst%E4rke
Aber ich weis net ob du so genau meinst, wie er es beschrieben hat.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Andreas_S
Beiträge: 787
Registriert: 14.04.2007 16:48
Wohnort: Wien Umgebung
Kontaktdaten:

Beitrag 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?
Andreas_S
Beiträge: 787
Registriert: 14.04.2007 16:48
Wohnort: Wien Umgebung
Kontaktdaten:

Beitrag 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!
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

Wieso willst Du das 'hooken'?

Wieso ist das eine russische Methode?
a²+b²=mc²
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Andreas_S
Beiträge: 787
Registriert: 14.04.2007 16:48
Wohnort: Wien Umgebung
Kontaktdaten:

Beitrag 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.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Andreas_S
Beiträge: 787
Registriert: 14.04.2007 16:48
Wohnort: Wien Umgebung
Kontaktdaten:

Beitrag 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.
Andreas_S
Beiträge: 787
Registriert: 14.04.2007 16:48
Wohnort: Wien Umgebung
Kontaktdaten:

Beitrag 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?
Antworten