delphi – 如何检查系统主卷是静音还是取消静音?
发布时间:2020-12-15 10:11:46 所属栏目:大数据 来源:网络整理
导读:我正在使用此代码来静音/取消静音系统主音量: const APPCOMMAND_VOLUME_MUTE = $80000; WM_APPCOMMAND = $319;procedure TForm1.Button1Click(Sender: TObject);begin // toggle mute/unmute SendMessageW(Handle,WM_APPCOMMAND,Handle,APPCOMMAND_VOLUME_M
我正在使用此代码来静音/取消静音系统主音量:
const APPCOMMAND_VOLUME_MUTE = $80000; WM_APPCOMMAND = $319; procedure TForm1.Button1Click(Sender: TObject); begin // toggle mute/unmute SendMessageW(Handle,WM_APPCOMMAND,Handle,APPCOMMAND_VOLUME_MUTE); end; (从https://stackoverflow.com/a/154128/1140885获得代码) 它在XP上工作正常(还没有在Win7上测试它). 更新:对于XP,我最终使用了这里的代码:How to get the master volume in windows xp?(感谢@Sertac Akyuz) 我不得不改变一行: mxlc.dwControlType := MIXERCONTROL_CONTROLTYPE_VOLUME; 至: mxlc.dwControlType := MIXERCONTROL_CONTROLTYPE_MUTE; 返回值为0(不是静音)或1(静音). 解决方法
从Windows Vista开始,您必须使用
Core Audio SDK 来控制Windows音频.要检查主音量是否静音,您必须使用
IAudioEndpointVolume.GetMute 方法.
试试这个示例代码 {$APPTYPE CONSOLE} uses SysUtils,Windows,ActiveX,ComObj; const CLASS_IMMDeviceEnumerator : TGUID = '{BCDE0395-E52F-467C-8E3D-C4579291692E}'; IID_IMMDeviceEnumerator : TGUID = '{A95664D2-9614-4F35-A746-DE8DB63617E6}'; IID_IAudioEndpointVolume : TGUID = '{5CDF2C82-841E-4546-9722-0CF74078229A}'; type IAudioEndpointVolumeCallback = interface(IUnknown) ['{657804FA-D6AD-4496-8A60-352752AF4F89}'] end; IAudioEndpointVolume = interface(IUnknown) ['{5CDF2C82-841E-4546-9722-0CF74078229A}'] function RegisterControlChangeNotify(AudioEndPtVol: IAudioEndpointVolumeCallback): HRESULT; stdcall; function UnregisterControlChangeNotify(AudioEndPtVol: IAudioEndpointVolumeCallback): HRESULT; stdcall; function GetChannelCount(out PInteger): HRESULT; stdcall; function SetMasterVolumeLevel(fLevelDB: single; pguidEventContext: PGUID): HRESULT; stdcall; function SetMasterVolumeLevelScalar(fLevelDB: single; pguidEventContext: PGUID): HRESULT; stdcall; function GetMasterVolumeLevel(out fLevelDB: single): HRESULT; stdcall; function GetMasterVolumeLevelScaler(out fLevelDB: single): HRESULT; stdcall; function SetChannelVolumeLevel(nChannel: Integer; fLevelDB: double; pguidEventContext: PGUID): HRESULT; stdcall; function SetChannelVolumeLevelScalar(nChannel: Integer; fLevelDB: double; pguidEventContext: PGUID): HRESULT; stdcall; function GetChannelVolumeLevel(nChannel: Integer; out fLevelDB: double): HRESULT; stdcall; function GetChannelVolumeLevelScalar(nChannel: Integer; out fLevel: double): HRESULT; stdcall; function SetMute(bMute: Boolean; pguidEventContext: PGUID): HRESULT; stdcall; function GetMute(out bMute: Boolean): HRESULT; stdcall; function GetVolumeStepInfo(pnStep: Integer; out pnStepCount: Integer): HRESULT; stdcall; function VolumeStepUp(pguidEventContext: PGUID): HRESULT; stdcall; function VolumeStepDown(pguidEventContext: PGUID): HRESULT; stdcall; function QueryHardwareSupport(out pdwHardwareSupportMask): HRESULT; stdcall; function GetVolumeRange(out pflVolumeMindB: double; out pflVolumeMaxdB: double; out pflVolumeIncrementdB: double): HRESULT; stdcall; end; IAudioMeterInformation = interface(IUnknown) ['{C02216F6-8C67-4B5B-9D00-D008E73E0064}'] end; IPropertyStore = interface(IUnknown) end; IMMDevice = interface(IUnknown) ['{D666063F-1587-4E43-81F1-B948E807363F}'] function Activate(const refId: TGUID; dwClsCtx: DWORD; pActivationParams: PInteger; out pEndpointVolume: IAudioEndpointVolume): HRESULT; stdCall; function OpenPropertyStore(stgmAccess: DWORD; out ppProperties: IPropertyStore): HRESULT; stdcall; function GetId(out ppstrId: PLPWSTR): HRESULT; stdcall; function GetState(out State: Integer): HRESULT; stdcall; end; IMMDeviceCollection = interface(IUnknown) ['{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}'] end; IMMNotificationClient = interface(IUnknown) ['{7991EEC9-7E89-4D85-8390-6C703CEC60C0}'] end; IMMDeviceEnumerator = interface(IUnknown) ['{A95664D2-9614-4F35-A746-DE8DB63617E6}'] function EnumAudioEndpoints(dataFlow: TOleEnum; deviceState: SYSUINT; DevCollection: IMMDeviceCollection): HRESULT; stdcall; function GetDefaultAudioEndpoint(EDF: SYSUINT; ER: SYSUINT; out Dev :IMMDevice ): HRESULT; stdcall; function GetDevice(pwstrId: pointer; out Dev: IMMDevice): HRESULT; stdcall; function RegisterEndpointNotificationCallback(pClient: IMMNotificationClient): HRESULT; stdcall; end; function IsMasterVolumeMute : Boolean; var pEndpointVolume: IAudioEndpointVolume; LDeviceEnumerator: IMMDeviceEnumerator; Dev: IMMDevice; bMute: Boolean; begin if not Succeeded(CoCreateInstance(CLASS_IMMDeviceEnumerator,nil,CLSCTX_INPROC_SERVER,IID_IMMDeviceEnumerator,LDeviceEnumerator)) then RaiseLastOSError; if not Succeeded(LDeviceEnumerator.GetDefaultAudioEndpoint($00000000,$00000000,Dev)) then RaiseLastOSError; if not Succeeded( Dev.Activate(IID_IAudioEndpointVolume,pEndpointVolume)) then RaiseLastOSError; if not Succeeded(pEndpointVolume.GetMute(bMute)) then RaiseLastOSError else Result:=bMute; end; begin try CoInitialize(nil); try Writeln(Format('Master Volume is Mute ? : %s',[BoolToStr(IsMasterVolumeMute,True)])); finally CoUninitialize; end; except on E:Exception do Writeln(E.Classname,':',E.Message); end; Writeln('Press Enter to exit'); Readln; end. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |