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;
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 –
Ich sage nicht, dass dies muss sei mit Delphi, aber ich möchte wissen, wie man das mit Delphi macht. – eKek0
Dieser Link behandelt das Wave-Volume, nicht das Master-Volume. – eKek0