2010-12-21 9 views
5

En Windows XP, con Delphi, ¿cómo obtener el volumen maestro?¿Cómo obtener el volumen maestro en Windows XP?

Sé que puedo configurar y enviar el envío de teclas con keybd_event(VK_VOLUME_UP, 1, 0, 0); y keybd_event(VK_VOLUME_DOWN, 1, 0, 0);, pero no sé cómo obtener el valor real del volumen.

+0

Esta pregunta no tiene nada que ver en particular con Delphi, sino solo con la API de Windows. Este enlace podría ayudar: http://blogs.msdn.com/b/alejacma/archive/2010/01/13/how-to-set-sound-volume-programmatically.aspx –

+0

No estoy diciendo que esto tenga que estar con Delphi, pero que quiero saber _cómo hacer_ esto _with_ delphi. – eKek0

+0

Ese enlace trata sobre el volumen de la onda, no el volumen maestro. – eKek0

Respuesta

3

La siguiente es una pequeña modificación en el código de ejemplo encontrado here (acreditado que es Thomas Stutz). El ejemplo allí establece el volumen del micrófono. Acabo de modificar el tipo de componente - destino del altavoz en lugar de la fuente del micrófono, y reemplacé mixerSetControlDetails con mixerGetControlDetails, y convertí el colocador en un captador, por supuesto. En los pocos sistemas que probé aquí (XPSp3, XPSp2, W2K, 98), parece que funciona. El retorno de la función es el altavoz del primer mezclador (predeterminado): un valor de 0-65535, el 'ShowMessage' en el manejador de botones lo cambia a un porcentaje. Pero no me preguntes más detalles al respecto, realmente no tengo experiencia con la aplicación de mezclador. En su lugar, refiérase a here f.i., aunque viejo, el artículo realmente me pareció completo.

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

siempre obtengo el valor 0. utilizo Windows 7 – opc0de

+4

@ opc0de - Mire al título de la pregunta, eKek0 pidió específicamente el código que funcionaba para ** XP **. Si lees los comentarios a su respuesta, verás que él sabe que con Vista y hasta las cosas son diferentes. –

Cuestiones relacionadas