C# 如何以编程方式控制电脑的音量?

C# 如何以编程方式控制电脑的音量?,c#,windows,delphi,multimedia,volume,C#,Windows,Delphi,Multimedia,Volume,我有一个没有音乐键的键盘,用于在我的电脑中调低音量、播放、停止音乐等。如果你不明白,是我的键盘,不是 我想在Windows和Delphi或C#中实现一个键盘挂钩,以在我的键盘中创建音量功能,但我不知道如何通过代码来调整音量。我尝试了很多例子,但是没有成功(顺便说一句,都是在Delphi中) 你知道如何通过编码来调节音量吗 就行了。它有一个“”命令,可以调整所有音频设备的音量/静音级别。其中一个教程可能会帮助您入门: 下面是delphi代码 我的keyhook向我的主窗体发送一条消息,其中包含L

我有一个没有音乐键的键盘,用于在我的电脑中调低音量、播放、停止音乐等。如果你不明白,是我的键盘,不是

我想在Windows和Delphi或C#中实现一个键盘挂钩,以在我的键盘中创建音量功能,但我不知道如何通过代码来调整音量。我尝试了很多例子,但是没有成功(顺便说一句,都是在Delphi中)


你知道如何通过编码来调节音量吗

就行了。它有一个“”命令,可以调整所有音频设备的音量/静音级别。

其中一个教程可能会帮助您入门:

下面是delphi代码

我的keyhook向我的主窗体发送一条消息,其中包含LParam中的键的VK代码

procedure TmainFrm.keyHook(var msg: TMessage);
begin
  case msg.LParam of
    VK_VOLUME_UP  : g_mixer.volume := g_mixer.volume + 2048;
    VK_VOLUME_DOWN: g_mixer.volume := g_mixer.volume - 2048;
    VK_VOLUME_MUTE: g_mixer.muted := not g_mixer.muted;
  end;
end;
音量范围为0。。65535; 带外值将以静默方式更正

-


这是glob优秀答案的补充。SetMute/GetMute函数声明必须使用32位整数值

unit MMDevApi_tlb;
const
  DEVICE_STATE_ACTIVE       = $00000001;
  DEVICE_STATE_UNPLUGGED    = $00000002;
  DEVICE_STATE_NOTPRESENT   = $00000004;
  DEVICE_STATEMASK_ALL      = $00000007;

  IMMAudioEndpointVolume = interface(IUnknown)
  ['{5CDF2C82-841E-4546-9722-0CF74078229A}']
    Function SetMute(iMute: Integer; pguidEventContext: PGUID) :Integer; stdcall;
    Function GetMute(out iMute: Integer) :Integer; stdcall;
更改SetMute和GetMute声明以使用整数变量,并将Delphi boolean强制转换为整数

然后调用方法 变量 iMute:整数 AudioEndVol.SetMute(整数(复选框1.Checked),@GUID\u NULL); AudioEndVol.GetMute(iMute)

使用bool不能使trayicon正确识别静音状态,取消静音根本不起作用。getmute也是一样,它必须使用32位整数输出参数,否则内存对齐会随机损坏。我不理解谷歌搜索到的一篇绝地文章中的推理

有些win32调用对按位值非常挑剔,Delphi Bool/Boolean并不总是与C对应。使用32位整数表示C bool变量,以获得精确的按位匹配。大多数win32 C方法没有那么严格,可以很好地处理bool/boolean。这个特定的MMDeviceAPI.SetMute函数是一个罕见的特例,Delphi程序员受到了沉重的打击。

一些你可能想读的文章:它仍然需要一些脚本——如果你随便看看,可能有人已经创建了自动热键脚本。很好<代码>^!NumpadSub::发送{Volume\u Up 10}
^!NumpadAdd::发送{Volume_Down 10}
^!NumpadEnter::发送{Volume\u Mute}
unit MMDevApi_tlb;

interface
  uses Windows, ActiveX, Classes, Graphics, OleServer, OleCtrls, StdVCL,ComObj;
const
  // TypeLibrary Major and minor versions

  CLSID_MMDeviceEnumerator: TGUID               = '{BCDE0395-E52F-467C-8E3D-C4579291692E}';
  IID_IMMDeviceEnumerator: TGUID                = '{A95664D2-9614-4F35-A746-DE8DB63617E6}';
  IID_IMMDevice: TGUID                          = '{D666063F-1587-4E43-81F1-B948E807363F}';
  IID_IMMDeviceCollection: TGUID                = '{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}';
  IID_IAudioEndpointVolume: TGUID               = '{5CDF2C82-841E-4546-9722-0CF74078229A}';
  IID_IAudioMeterInformation : TGUID            = '{C02216F6-8C67-4B5B-9D00-D008E73E0064}';
  IID_IAudioEndpointVolumeCallback: TGUID       = '{657804FA-D6AD-4496-8A60-352752AF4F89}';
  GUID_NULL: TGUID                              = '{00000000-0000-0000-0000-000000000000}';

  DEVICE_STATE_ACTIVE                   = $00000001;
  DEVICE_STATE_UNPLUGGED                = $00000002;
  DEVICE_STATE_NOTPRESENT               = $00000004;
  DEVICE_STATEMASK_ALL                  = $00000007;

type
  EDataFlow = TOleEnum;
const
  eRender                               = $00000000;
  eCapture                              = $00000001;
  eAll                                  = $00000002;
  EDataFlow_enum_count                  = $00000003;

type
  ERole = TOleEnum;
const
  eConsole                              = $00000000;
  eMultimedia                           = $00000001;
  eCommunications                       = $00000002;
  ERole_enum_count                      = $00000003;

type
  IAudioEndpointVolumeCallback = interface(IUnknown)
  ['{657804FA-D6AD-4496-8A60-352752AF4F89}']
  end;

  IMMAudioEndpointVolume = interface(IUnknown)
  ['{5CDF2C82-841E-4546-9722-0CF74078229A}']
    Function RegisterControlChangeNotify( AudioEndPtVol: IAudioEndpointVolumeCallback): Integer; stdcall;
    Function UnregisterControlChangeNotify( AudioEndPtVol: IAudioEndpointVolumeCallback): Integer; stdcall;
    Function GetChannelCount(out PInteger): Integer; stdcall;
    Function SetMasterVolumeLevel(fLevelDB: single; pguidEventContext: PGUID):Integer; stdcall;
    Function SetMasterVolumeLevelScalar(fLevelDB: single; pguidEventContext: PGUID):Integer; stdcall;
    Function GetMasterVolumeLevel(out fLevelDB: single):Integer; stdcall;
    Function GetMasterVolumeLevelScalar(out fLevel: single):Integer; stdcall;
    Function SetChannelVolumeLevel(nChannel: Integer; fLevelDB: double; pguidEventContext: TGUID):Integer; stdcall;
    Function SetChannelVolumeLevelScalar(nChannel: Integer; fLevelDB: single; pguidEventContext: TGUID):Integer; stdcall;
    Function GetChannelVolumeLevel(nChannel: Integer; out fLevelDB: double) : Integer; stdcall;
    Function GetChannelVolumeLevelScalar(nChannel: Integer; out fLevel: double) : Integer; stdcall;
    Function SetMute(bMute: Boolean ; pguidEventContext: PGUID) :Integer; stdcall;
    Function GetMute(out bMute: Boolean ) :Integer; stdcall;
    Function GetVolumeStepInfo( pnStep: Integer; out pnStepCount: Integer):Integer; stdcall;
    Function VolumeStepUp(pguidEventContext: TGUID) :Integer; stdcall;
    Function VolumeStepDown(pguidEventContext: TGUID) :Integer; stdcall;
    Function QueryHardwareSupport(out pdwHardwareSupportMask): Integer; stdcall;
    Function GetVolumeRange(out pflVolumeMindB: double; out pflVolumeMaxdB: double; out pflVolumeIncrementdB: double): Integer; stdcall;
  end;

  IPropertyStore = interface(IUnknown)
  end;

type
  IMMDevice = interface(IUnknown)
  ['{D666063F-1587-4E43-81F1-B948E807363F}']
    Function Activate(  const refId :TGUID;
                        dwClsCtx: DWORD;
                        pActivationParams: PInteger ;
                        out pEndpointVolume: IMMAudioEndpointVolume): 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: EDataFlow; 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;

  implementation
end.
unit MMDevApi_tlb;
const
  DEVICE_STATE_ACTIVE       = $00000001;
  DEVICE_STATE_UNPLUGGED    = $00000002;
  DEVICE_STATE_NOTPRESENT   = $00000004;
  DEVICE_STATEMASK_ALL      = $00000007;

  IMMAudioEndpointVolume = interface(IUnknown)
  ['{5CDF2C82-841E-4546-9722-0CF74078229A}']
    Function SetMute(iMute: Integer; pguidEventContext: PGUID) :Integer; stdcall;
    Function GetMute(out iMute: Integer) :Integer; stdcall;