NXP

【Delphi】Vista以上系统的进程静音

2019-07-12 13:25发布

单个进程的音量控制是从Vista系统中才开始支持的,所以此函数需要在Vista及以上的系统中使用。 XP下面使用这个函数会导致系统全局静音。所以在XP下要使进程静音要使用Hook技术,可以参见另一篇:http://blog.csdn.net/aqtata/article/details/8112092   Delphi XE + Win7 x64 编译测试通过 uses MMSystem; function EnableMute(const Mute: Boolean): Boolean; var hmx: HMIXER; mxlc: MIXERLINECONTROLS; mxl: MIXERLINE; mxc: MIXERCONTROL; mxcd: tMIXERCONTROLDETAILS; mxcdMute: MIXERCONTROLDETAILS_BOOLEAN; begin Result := False; if Win32MajorVersion < 6 then Exit; if mixerOpen(@hmx, 0, 0, 0, 0) <> MMSYSERR_NOERROR then Exit; mxl.cbStruct := SizeOf(mxl); mxl.dwComponentType := MIXERLINE_COMPONENTTYPE_DST_SPEAKERS; if mixerGetLineInfo(hmx, @mxl, MIXER_GETLINEINFOF_COMPONENTTYPE) = MMSYSERR_NOERROR then begin mxlc.cbStruct := SizeOf(MIXERLINECONTROLS); mxlc.dwLineID := mxl.dwLineID; mxlc.dwControlType := MIXERCONTROL_CONTROLTYPE_MUTE; mxlc.cControls := 1; mxlc.cbmxctrl := SizeOf(MIXERCONTROL); mxlc.pamxctrl := @mxc; if mixerGetLineControls(hmx, @mxlc, MIXER_GETLINECONTROLSF_ONEBYTYPE) = MMSYSERR_NOERROR then begin mxcdMute.fValue := Integer(Mute); mxcd.hwndOwner := 0; mxcd.dwControlID := mxc.dwControlID; mxcd.cbStruct := SizeOf(mxcd); mxcd.cbDetails := SizeOf(mxcdMute); mxcd.paDetails := @mxcdMute; mxcd.cChannels := 1; mxcd.cMultipleItems := 0; Result := mixerSetControlDetails(hmx, @mxcd, MIXER_OBJECTF_HMIXER or MIXER_SETCONTROLDETAILSF_VALUE) = MMSYSERR_NOERROR; end; end; mixerClose(hmx); end;