在Windows 7中控制主扬声器音量

问题描述 投票:4回答:2

我编写了一个非常简单的应用程序,用于在Windows 7上运行的Delphi 2007中播放音乐收藏。我为Windows Media Player掏腰包,以避免Delphi Media Player组件拒绝播放某些曲目,我扔给它。我现在想从应用程序控制扬声器的音量。

此时,我说的是“扬声器音量”而不是“ WMP音量”,因为我想控制WMP的音量比控制所有应用程序的整体扬声器/主音量要困难得多。

我确信这在过去非常简单,但是OS变得更加复杂,我发现并尝试过的所有代码段都不适用于控制扬声器的主/核心音量。

是否有可能通过Windows 7上运行的Delphi 2007控制此主卷?

如果是这样,那么我将非常喜欢使用诸如GetVolume和SetVolume之类的几个函数来完成这样的基本任务。

我看过过去问过的类似问题,但我没有希望。

布鲁斯。

delphi volume delphi-2007
2个回答
6
投票
在Windows 7下,您必须使用Core Audio SDK来控制Windows音频。从这里,您可以尝试IAudioEndpointVolume::SetMasterVolumeLevelScalarIAudioEndpointVolume::SetMasterVolumeLevel方法。

尝试使用SetMasterVolumeLevelScalar方法的此代码。

{$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; procedure SetMasterVolume(fLevelDB: single); var pEndpointVolume: IAudioEndpointVolume; LDeviceEnumerator: IMMDeviceEnumerator; Dev: IMMDevice; 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, CLSCTX_INPROC_SERVER, nil, pEndpointVolume)) then RaiseLastOSError; if not Succeeded(pEndpointVolume.SetMasterVolumeLevelScalar(fLevelDB, nil)) then RaiseLastOSError; end; begin try CoInitialize(nil); try SetMasterVolume(1.0); //set the volume to the max Sleep(2000); SetMasterVolume(0.5); //set the volume to the 50 % Sleep(2000); SetMasterVolume(0.1); //set the volume to the 10 % Sleep(2000); finally CoUninitialize; end; except on E:Exception do Writeln(E.Classname, ':', E.Message); end; Writeln('Press Enter to exit'); Readln; end.


0
投票
我已经在Windows 10下成功尝试了此代码,但是几秒钟后,它跳回到了原始设置。我似乎无法找出原因?
© www.soinside.com 2019 - 2024. All rights reserved.