gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 15:25:22 27 4
gpt4 key购买 nike

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

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

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

是否可以从 Windows 7 上运行的 Delphi 2007 控制该主音量?

如果是这样,那么我将非常感谢我可以使用 GetVolume 和 SetVolume 等几个函数来完成这样的基本任务。

我看过过去提出的类似问题,但我不抱希望。

布鲁斯。

最佳答案

在 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.

关于delphi - 在 Windows 7 中控制主扬声器音量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17612666/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com