Delphi 在Windows7中控制主扬声器音量

Delphi 在Windows7中控制主扬声器音量,delphi,volume,delphi-2007,Delphi,Volume,Delphi 2007,我编写了一个非常简单的应用程序,用于在Windows7上运行的Delphi2007中播放我的音乐集。为了避免Delphi Media Player组件拒绝播放我扔给它的一些曲目,我向Windows Media Player付费。我现在想从应用程序控制扬声器的音量 在这一点上,我说“扬声器音量”而不是“WMP音量”,因为我认为控制WMP的音量比控制所有应用程序的整个扬声器/主音量更困难 我相信这在过去是非常简单的,但是操作系统变得更加复杂,我发现并尝试过的所有代码片段都不适用于控制扬声器的主/核心

我编写了一个非常简单的应用程序,用于在Windows7上运行的Delphi2007中播放我的音乐集。为了避免Delphi Media Player组件拒绝播放我扔给它的一些曲目,我向Windows Media Player付费。我现在想从应用程序控制扬声器的音量

在这一点上,我说“扬声器音量”而不是“WMP音量”,因为我认为控制WMP的音量比控制所有应用程序的整个扬声器/主音量更困难

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

是否可以从运行在Windows 7上的Delphi 2007控制此主卷

如果是的话,那么我将非常感谢使用GetVolume和SetVolume这样的两个函数来完成这项基本任务

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


布鲁斯

在Windows 7下,您必须使用来控制Windows音频。从这里您可以尝试或方法

尝试使用
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版本在问题中被提到了两次,@Tlama,但我看不出它是如何如此相关以至于需要包含在标记中。你认为不同的版本需要不同的答案吗?@Rob,啊,对不起。收回。我之所以这么问是因为类型库导入可能存在差异。。。(即使不应该,我知道)。但没关系,我已经没有时间再问这个问题了。它会和吗?@Rob,是的,但我更喜欢MS.也有一些Delphi翻译,例如with,但我不相信有任何代码的作者甚至不能遵循正确的代码格式。