在Windows XP中,使用Delphi,如何获取主卷?
我知道我可以使用keybd_event(VK_VOLUME_UP,1,0)设置和发送击键;和keybd_event(VK_VOLUME_DOWN,0);但我不知道如何获取卷的实际值.
解决方法
以下是对找到的示例代码
here的一点修改(记入Thomas Stutz).这个例子设置了麦克风音量.我刚刚修改了组件类型 – 扬声器目的地而不是麦克风源,并用
mixerGetControlDetails
替换了mixerSetControlDetails,当然把setter变成了一个getter.在我测试的几个系统(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); 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;