2010-12-21 47 views
5

在Windows XP中,用Delphi,如何获得主音量?如何在Windows XP中获得主卷?

我知道我可以通过keybd_event(VK_VOLUME_UP, 1, 0, 0);keybd_event(VK_VOLUME_DOWN, 1, 0, 0);来设置和发送击键,但我不知道如何获得音量的实际值。

+0

这个问题没有什么特别与德尔福,但只有Windows API。此链接可能有所帮助:http://blogs.msdn.com/b/alejacma/archive/2010/01/13/how-to-set-sound-volume-programmatically.aspx – 2010-12-22 00:35:02

+0

我不是说这必须与delphi一起,但我想知道_ how_这个_with_ delphi。 – eKek0 2010-12-22 00:41:07

回答

3

以下是对发现的示例代码here(相信有Thomas Stutz)的一些修改。这里的例子设置麦克风音量。我只是修改了组件类型 - 扬声器目标而不是麦克风源,并且用mixerGetControlDetails替换mixerSetControlDetails,并且当然将setter变成吸气剂。在我测试的少数几个系统上(XPSp3,XPSp2,W2K,98),似乎可行。函数返回的是第一个(默认)混音器中的扬声器 - 值为0-65535,按钮处理程序中的“ShowMessage”将其更改为百分比。但是不要问我更多关于它的细节,我真的没有使用混音器API的经验。相反,请参阅here f.i.,尽管这篇文章对我来说似乎很全面。

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;