2010-12-21 10 views
5

In Windows XP, mit Delphi, wie bekomme ich das Master-Volume?Wie bekomme ich das Master-Volume in Windows XP?

Ich weiß, ich kann Tastenhübe mit keybd_event(VK_VOLUME_UP, 1, 0, 0); und keybd_event(VK_VOLUME_DOWN, 1, 0, 0); senden und absetzen, aber ich weiß nicht, wie man den tatsächlichen Wert des Volumens erhält.

+0

Diese Frage hat nichts speziell mit Delphi zu tun, sondern nur die Windows-API. Dieser Link könnte helfen: http://blogs.msdn.com/b/alejacma/archive/2010/01/13/how-to-set-sound-volume-programmatica.aspx –

+0

Ich sage nicht, dass dies muss sei mit Delphi, aber ich möchte wissen, wie man das mit Delphi macht. – eKek0

+0

Dieser Link behandelt das Wave-Volume, nicht das Master-Volume. – eKek0

Antwort

3

Das unten ist eine kleine Änderung am Beispiel Code gefunden here (gutgeschrieben dort ist Thomas Stutz). Das Beispiel dort stellt die Mikrofonlautstärke ein. Ich habe gerade den Komponententyp - Lautsprecherziel anstelle der Mikrofonquelle geändert und mixerSetControlDetails durch mixerGetControlDetails ersetzt und den Setter natürlich zu einem Getter gemacht. Auf den wenigen Systemen, die ich hier getestet habe (XPSp3, XPSp2, W2K, 98), scheint es zu funktionieren. Die Rückgabe der Funktion ist der Lautsprecher aus dem ersten (Standard) Mixer - ein Wert von 0-65535, der 'ShowMessage' im Button-Handler ändert es in einen Prozentsatz. Aber frag mich nicht mehr darüber, ich habe wirklich keine Erfahrung mit dem Mixer api. Stattdessen beziehen Sie sich auf here f.i, obwohl alt der Artikel wirklich zu mir umfassend schien.

function GetSpeakerVolume(var bValue: Word): Boolean; 
var       {0..65535} 
    hMix: HMIXER; 
    mxlc: MIXERLINECONTROLS; 
    mxcd: TMIXERCONTROLDETAILS; 
    vol: TMIXERCONTROLDETAILS_UNSIGNED; 
    mxc: MIXERCONTROL; 
    mxl: TMixerLine; 
    intRet: Integer; 
    nMixerDevs: Integer; 
begin 
    Result := False; 

    // Check if Mixer is available 
    nMixerDevs := mixerGetNumDevs(); 
    if (nMixerDevs < 1) then 
    Exit; 

    // open the mixer 
    intRet := mixerOpen(@hMix, 0, 0, 0, 0); 
    if intRet = MMSYSERR_NOERROR then 
    begin 
    mxl.dwComponentType := MIXERLINE_COMPONENTTYPE_DST_SPEAKERS; 
    mxl.cbStruct := SizeOf(mxl); 

    // get line info 
    intRet := mixerGetLineInfo(hMix, @mxl, MIXER_GETLINEINFOF_COMPONENTTYPE); 

    if intRet = MMSYSERR_NOERROR then 
    begin 
     ZeroMemory(@mxlc, SizeOf(mxlc)); 
     mxlc.cbStruct := SizeOf(mxlc); 
     mxlc.dwLineID := mxl.dwLineID; 
     mxlc.dwControlType := MIXERCONTROL_CONTROLTYPE_VOLUME; 
     mxlc.cControls := 1; 
     mxlc.cbmxctrl := SizeOf(mxc); 

     mxlc.pamxctrl := @mxc; 
     intRet := mixerGetLineControls(hMix, @mxlc, MIXER_GETLINECONTROLSF_ONEBYTYPE); 

     if intRet = MMSYSERR_NOERROR then 
     begin 
     ZeroMemory(@mxcd, SizeOf(mxcd)); 
     mxcd.dwControlID := mxc.dwControlID; 
     mxcd.cbStruct := SizeOf(mxcd); 
     mxcd.cMultipleItems := 0; 
     mxcd.cbDetails := SizeOf(vol); 
     mxcd.paDetails := @vol; 
     mxcd.cChannels := 1; 

     intRet := mixerGetControlDetails(hMix, @mxcd, MIXER_GETCONTROLDETAILSF_VALUE); 
     if intRet <> MMSYSERR_NOERROR then 
      ShowMessage('GetControlDetails Error') 
     else begin 
      bValue := vol.dwValue; 
      Result := True; 
     end; 
     end 
     else 
     ShowMessage('GetLineInfo Error'); 
    end; 
    intRet := mixerClose(hMix); 
    end; 
end; 


procedure TForm1.Button1Click(Sender: TObject); 
var 
    Vol: Word; 
begin 
    if GetSpeakerVolume(Vol) then 
    ShowMessage(IntToStr(Round(Vol * 100/65535))); 
end; 
+0

Ich bekomme immer den Wert 0. Ich benutze Windows 7 – opc0de

+4

@ opc0de - Schau auf den Titel der Frage, eKek0 speziell nach Code gefragt, der für ** XP ** funktioniert. Wenn Sie die Kommentare zu seiner Antwort lesen, werden Sie sehen, dass er mit Vista weiß, dass die Dinge anders sind. –