• 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
  • 相关阅读:
    win7 64位安装mongodb及管理工具mongoVUE1.6.9.0
    常见共识算法
    Go语言学习笔记(5)——集合Map
    UPUPW Apache5.5系列本地开发环境配置
    TCP/IP协议
    HTTP协议
    Gossip协议
    《CAP定理》
    比特币双花攻击
    Fabric中的节点类型
  • 原文地址:https://www.cnblogs.com/yinghualuowu/p/10019358.html
Copyright © 2020-2023  润新知