C# 有关系统音量的操作
需要知道的
调音量是可以快捷键的,还可以用Winmm.dll,但是这个过于复杂了,还有左右声道,我们不需要这么复杂。还有个办法
https://stackoverflow.com/questions/14306048/controlling-volume-mixer
代码
public static class SystemVolume { #region Master Volume Manipulation /// <summary> /// 返回系统音量(1~100) /// </summary> public static float GetMasterVolume() { IAudioEndpointVolume masterVol = null; try { masterVol = GetMasterVolumeObject(); if (masterVol == null) return -1; masterVol.GetMasterVolumeLevelScalar(out var volumeLevel); return volumeLevel * 100; } finally { if (masterVol != null) Marshal.ReleaseComObject(masterVol); } } /// <summary> /// 设置系统音量 /// </summary> public static void SetMasterVolume(float newLevel) { IAudioEndpointVolume masterVol = null; try { masterVol = GetMasterVolumeObject(); if (masterVol == null) return; masterVol.SetMasterVolumeLevelScalar(newLevel / 100, Guid.Empty); } finally { if (masterVol != null) Marshal.ReleaseComObject(masterVol); } } /// <summary> /// 设置系统静音 /// </summary> /// <param name="isMuted"></param> public static void SetMasterVolumeMute(bool isMuted) { IAudioEndpointVolume masterVol = null; try { masterVol = GetMasterVolumeObject(); if (masterVol == null) return; masterVol.SetMute(isMuted, Guid.Empty); } finally { if (masterVol != null) Marshal.ReleaseComObject(masterVol); } } private static IAudioEndpointVolume GetMasterVolumeObject() { IMMDeviceEnumerator deviceEnumerator = null; IMMDevice speakers = null; try { deviceEnumerator = (IMMDeviceEnumerator)new MMDeviceEnumerator(); deviceEnumerator.GetDefaultAudioEndpoint(EDataFlow.eRender, ERole.eMultimedia, out speakers); Guid iidIAudioEndpointVolume = typeof(IAudioEndpointVolume).GUID; speakers.Activate(ref iidIAudioEndpointVolume, 0, IntPtr.Zero, out var o); IAudioEndpointVolume masterVol = (IAudioEndpointVolume)o; return masterVol; } finally { if (speakers != null) Marshal.ReleaseComObject(speakers); if (deviceEnumerator != null) Marshal.ReleaseComObject(deviceEnumerator); } } #endregion } #region Abstracted COM interfaces from Windows CoreAudio API [ComImport] [Guid("BCDE0395-E52F-467C-8E3D-C4579291692E")] internal class MMDeviceEnumerator { } internal enum EDataFlow { eRender, eCapture, eAll, EDataFlow_enum_count } internal enum ERole { eConsole, eMultimedia, eCommunications, ERole_enum_count } [Guid("A95664D2-9614-4F35-A746-DE8DB63617E6"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] internal interface IMMDeviceEnumerator { int NotImpl1(); [PreserveSig] int GetDefaultAudioEndpoint(EDataFlow dataFlow, ERole role, out IMMDevice ppDevice); // the rest is not implemented } [Guid("D666063F-1587-4E43-81F1-B948E807363F"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] internal interface IMMDevice { [PreserveSig] int Activate(ref Guid iid, int dwClsCtx, IntPtr pActivationParams, [MarshalAs(UnmanagedType.IUnknown)] out object ppInterface); // the rest is not implemented } [Guid("E2F5BB11-0570-40CA-ACDD-3AA01277DEE8"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] internal interface IAudioSessionEnumerator { [PreserveSig] int GetCount(out int SessionCount); [PreserveSig] int GetSession(int SessionCount, out IAudioSessionControl2 Session); } [Guid("bfb7ff88-7239-4fc9-8fa2-07c950be9c6d"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] internal interface IAudioSessionControl2 { // IAudioSessionControl [PreserveSig] int NotImpl0(); [PreserveSig] int GetDisplayName([MarshalAs(UnmanagedType.LPWStr)] out string pRetVal); [PreserveSig] int SetDisplayName([MarshalAs(UnmanagedType.LPWStr)]string Value, [MarshalAs(UnmanagedType.LPStruct)] Guid EventContext); [PreserveSig] int GetIconPath([MarshalAs(UnmanagedType.LPWStr)] out string pRetVal); [PreserveSig] int SetIconPath([MarshalAs(UnmanagedType.LPWStr)] string Value, [MarshalAs(UnmanagedType.LPStruct)] Guid EventContext); [PreserveSig] int GetGroupingParam(out Guid pRetVal); [PreserveSig] int SetGroupingParam([MarshalAs(UnmanagedType.LPStruct)] Guid Override, [MarshalAs(UnmanagedType.LPStruct)] Guid EventContext); [PreserveSig] int NotImpl1(); [PreserveSig] int NotImpl2(); // IAudioSessionControl2 [PreserveSig] int GetSessionIdentifier([MarshalAs(UnmanagedType.LPWStr)] out string pRetVal); [PreserveSig] int GetSessionInstanceIdentifier([MarshalAs(UnmanagedType.LPWStr)] out string pRetVal); [PreserveSig] int GetProcessId(out int pRetVal); [PreserveSig] int IsSystemSoundsSession(); [PreserveSig] int SetDuckingPreference(bool optOut); } // http://netcoreaudio.codeplex.com/SourceControl/latest#trunk/Code/CoreAudio/Interfaces/IAudioEndpointVolume.cs [Guid("5CDF2C82-841E-4546-9722-0CF74078229A"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] public interface IAudioEndpointVolume { [PreserveSig] int NotImpl1(); [PreserveSig] int NotImpl2(); /// <summary> /// Gets a count of the channels in the audio stream. /// </summary> /// <param name="channelCount">The number of channels.</param> /// <returns>An HRESULT code indicating whether the operation passed of failed.</returns> [PreserveSig] int GetChannelCount( [Out] [MarshalAs(UnmanagedType.U4)] out UInt32 channelCount); /// <summary> /// Sets the master volume level of the audio stream, in decibels. /// </summary> /// <param name="level">The new master volume level in decibels.</param> /// <param name="eventContext">A user context value that is passed to the notification callback.</param> /// <returns>An HRESULT code indicating whether the operation passed of failed.</returns> [PreserveSig] int SetMasterVolumeLevel( [In] [MarshalAs(UnmanagedType.R4)] float level, [In] [MarshalAs(UnmanagedType.LPStruct)] Guid eventContext); /// <summary> /// Sets the master volume level, expressed as a normalized, audio-tapered value. /// </summary> /// <param name="level">The new master volume level expressed as a normalized value between 0.0 and 1.0.</param> /// <param name="eventContext">A user context value that is passed to the notification callback.</param> /// <returns>An HRESULT code indicating whether the operation passed of failed.</returns> [PreserveSig] int SetMasterVolumeLevelScalar( [In] [MarshalAs(UnmanagedType.R4)] float level, [In] [MarshalAs(UnmanagedType.LPStruct)] Guid eventContext); /// <summary> /// Gets the master volume level of the audio stream, in decibels. /// </summary> /// <param name="level">The volume level in decibels.</param> /// <returns>An HRESULT code indicating whether the operation passed of failed.</returns> [PreserveSig] int GetMasterVolumeLevel( [Out] [MarshalAs(UnmanagedType.R4)] out float level); /// <summary> /// Gets the master volume level, expressed as a normalized, audio-tapered value. /// </summary> /// <param name="level">The volume level expressed as a normalized value between 0.0 and 1.0.</param> /// <returns>An HRESULT code indicating whether the operation passed of failed.</returns> [PreserveSig] int GetMasterVolumeLevelScalar( [Out] [MarshalAs(UnmanagedType.R4)] out float level); /// <summary> /// Sets the volume level, in decibels, of the specified channel of the audio stream. /// </summary> /// <param name="channelNumber">The channel number.</param> /// <param name="level">The new volume level in decibels.</param> /// <param name="eventContext">A user context value that is passed to the notification callback.</param> /// <returns>An HRESULT code indicating whether the operation passed of failed.</returns> [PreserveSig] int SetChannelVolumeLevel( [In] [MarshalAs(UnmanagedType.U4)] UInt32 channelNumber, [In] [MarshalAs(UnmanagedType.R4)] float level, [In] [MarshalAs(UnmanagedType.LPStruct)] Guid eventContext); /// <summary> /// Sets the normalized, audio-tapered volume level of the specified channel in the audio stream. /// </summary> /// <param name="channelNumber">The channel number.</param> /// <param name="level">The new master volume level expressed as a normalized value between 0.0 and 1.0.</param> /// <param name="eventContext">A user context value that is passed to the notification callback.</param> /// <returns>An HRESULT code indicating whether the operation passed of failed.</returns> [PreserveSig] int SetChannelVolumeLevelScalar( [In] [MarshalAs(UnmanagedType.U4)] UInt32 channelNumber, [In] [MarshalAs(UnmanagedType.R4)] float level, [In] [MarshalAs(UnmanagedType.LPStruct)] Guid eventContext); /// <summary> /// Gets the volume level, in decibels, of the specified channel in the audio stream. /// </summary> /// <param name="channelNumber">The zero-based channel number.</param> /// <param name="level">The volume level in decibels.</param> /// <returns>An HRESULT code indicating whether the operation passed of failed.</returns> [PreserveSig] int GetChannelVolumeLevel( [In] [MarshalAs(UnmanagedType.U4)] UInt32 channelNumber, [Out] [MarshalAs(UnmanagedType.R4)] out float level); /// <summary> /// Gets the normalized, audio-tapered volume level of the specified channel of the audio stream. /// </summary> /// <param name="channelNumber">The zero-based channel number.</param> /// <param name="level">The volume level expressed as a normalized value between 0.0 and 1.0.</param> /// <returns>An HRESULT code indicating whether the operation passed of failed.</returns> [PreserveSig] int GetChannelVolumeLevelScalar( [In] [MarshalAs(UnmanagedType.U4)] UInt32 channelNumber, [Out] [MarshalAs(UnmanagedType.R4)] out float level); /// <summary> /// Sets the muting state of the audio stream. /// </summary> /// <param name="isMuted">True to mute the stream, or false to unmute the stream.</param> /// <param name="eventContext">A user context value that is passed to the notification callback.</param> /// <returns>An HRESULT code indicating whether the operation passed of failed.</returns> [PreserveSig] int SetMute( [In] [MarshalAs(UnmanagedType.Bool)] Boolean isMuted, [In] [MarshalAs(UnmanagedType.LPStruct)] Guid eventContext); /// <summary> /// Gets the muting state of the audio stream. /// </summary> /// <param name="isMuted">The muting state. True if the stream is muted, false otherwise.</param> /// <returns>An HRESULT code indicating whether the operation passed of failed.</returns> [PreserveSig] int GetMute( [Out] [MarshalAs(UnmanagedType.Bool)] out Boolean isMuted); /// <summary> /// Gets information about the current step in the volume range. /// </summary> /// <param name="step">The current zero-based step index.</param> /// <param name="stepCount">The total number of steps in the volume range.</param> /// <returns>An HRESULT code indicating whether the operation passed of failed.</returns> [PreserveSig] int GetVolumeStepInfo( [Out] [MarshalAs(UnmanagedType.U4)] out UInt32 step, [Out] [MarshalAs(UnmanagedType.U4)] out UInt32 stepCount); /// <summary> /// Increases the volume level by one step. /// </summary> /// <param name="eventContext">A user context value that is passed to the notification callback.</param> /// <returns>An HRESULT code indicating whether the operation passed of failed.</returns> [PreserveSig] int VolumeStepUp( [In] [MarshalAs(UnmanagedType.LPStruct)] Guid eventContext); /// <summary> /// Decreases the volume level by one step. /// </summary> /// <param name="eventContext">A user context value that is passed to the notification callback.</param> /// <returns>An HRESULT code indicating whether the operation passed of failed.</returns> [PreserveSig] int VolumeStepDown( [In] [MarshalAs(UnmanagedType.LPStruct)] Guid eventContext); /// <summary> /// Queries the audio endpoint device for its hardware-supported functions. /// </summary> /// <param name="hardwareSupportMask">A hardware support mask that indicates the capabilities of the endpoint.</param> /// <returns>An HRESULT code indicating whether the operation passed of failed.</returns> [PreserveSig] int QueryHardwareSupport( [Out] [MarshalAs(UnmanagedType.U4)] out UInt32 hardwareSupportMask); /// <summary> /// Gets the volume range of the audio stream, in decibels. /// </summary> /// <param name="volumeMin">The minimum volume level in decibels.</param> /// <param name="volumeMax">The maximum volume level in decibels.</param> /// <param name="volumeStep">The volume increment level in decibels.</param> /// <returns>An HRESULT code indicating whether the operation passed of failed.</returns> [PreserveSig] int GetVolumeRange( [Out] [MarshalAs(UnmanagedType.R4)] out float volumeMin, [Out] [MarshalAs(UnmanagedType.R4)] out float volumeMax, [Out] [MarshalAs(UnmanagedType.R4)] out float volumeStep); } #endregion