2013-01-13 161 views
38

我想控制其他应用程序音量(firefox)。控制音量调音台

我可以Volume Mixer

enter image description here

什么Volume Mixer的图书馆办呢?

+0

有点谷歌给出了这个:http://www.dreamincode.net/forums/topic/45693-controlling-sound-volume-in-c%23/ –

+2

这是在Windows中通过WASAPI,Windows音频会话API。你需要一个包装它,通过搜索“c#wasapi”找到谷歌点击 –

+0

@Simon Mourier我认为这个代码控制系统volume.i只想控制firefox卷。 – user1974519

回答

67

下面是一个示例C#控制台应用程序。它基于Windows Core Audio Library。它仅适用于Windows 7和更高版本。

using System; 
using System.Runtime.InteropServices; 
using System.Collections.Generic; 

namespace SetAppVolumne 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      const string app = "Mozilla Firefox"; 

      foreach (string name in EnumerateApplications()) 
      { 
       Console.WriteLine("name:" + name); 
       if (name == app) 
       { 
        // display mute state & volume level (% of master) 
        Console.WriteLine("Mute:" + GetApplicationMute(app)); 
        Console.WriteLine("Volume:" + GetApplicationVolume(app)); 

        // mute the application 
        SetApplicationMute(app, true); 

        // set the volume to half of master volume (50%) 
        SetApplicationVolume(app, 50); 
       } 
      } 
     } 

     public static float? GetApplicationVolume(string name) 
     { 
      ISimpleAudioVolume volume = GetVolumeObject(name); 
      if (volume == null) 
       return null; 

      float level; 
      volume.GetMasterVolume(out level); 
      return level * 100; 
     } 

     public static bool? GetApplicationMute(string name) 
     { 
      ISimpleAudioVolume volume = GetVolumeObject(name); 
      if (volume == null) 
       return null; 

      bool mute; 
      volume.GetMute(out mute); 
      return mute; 
     } 

     public static void SetApplicationVolume(string name, float level) 
     { 
      ISimpleAudioVolume volume = GetVolumeObject(name); 
      if (volume == null) 
       return; 

      Guid guid = Guid.Empty; 
      volume.SetMasterVolume(level/100, ref guid); 
     } 

     public static void SetApplicationMute(string name, bool mute) 
     { 
      ISimpleAudioVolume volume = GetVolumeObject(name); 
      if (volume == null) 
       return; 

      Guid guid = Guid.Empty; 
      volume.SetMute(mute, ref guid); 
     } 

     public static IEnumerable<string> EnumerateApplications() 
     { 
      // get the speakers (1st render + multimedia) device 
      IMMDeviceEnumerator deviceEnumerator = (IMMDeviceEnumerator)(new MMDeviceEnumerator()); 
      IMMDevice speakers; 
      deviceEnumerator.GetDefaultAudioEndpoint(EDataFlow.eRender, ERole.eMultimedia, out speakers); 

      // activate the session manager. we need the enumerator 
      Guid IID_IAudioSessionManager2 = typeof(IAudioSessionManager2).GUID; 
      object o; 
      speakers.Activate(ref IID_IAudioSessionManager2, 0, IntPtr.Zero, out o); 
      IAudioSessionManager2 mgr = (IAudioSessionManager2)o; 

      // enumerate sessions for on this device 
      IAudioSessionEnumerator sessionEnumerator; 
      mgr.GetSessionEnumerator(out sessionEnumerator); 
      int count; 
      sessionEnumerator.GetCount(out count); 

      for (int i = 0; i < count; i++) 
      { 
       IAudioSessionControl ctl; 
       sessionEnumerator.GetSession(i, out ctl); 
       string dn; 
       ctl.GetDisplayName(out dn); 
       yield return dn; 
       Marshal.ReleaseComObject(ctl); 
      } 
      Marshal.ReleaseComObject(sessionEnumerator); 
      Marshal.ReleaseComObject(mgr); 
      Marshal.ReleaseComObject(speakers); 
      Marshal.ReleaseComObject(deviceEnumerator); 
     } 

     private static ISimpleAudioVolume GetVolumeObject(string name) 
     { 
      // get the speakers (1st render + multimedia) device 
      IMMDeviceEnumerator deviceEnumerator = (IMMDeviceEnumerator)(new MMDeviceEnumerator()); 
      IMMDevice speakers; 
      deviceEnumerator.GetDefaultAudioEndpoint(EDataFlow.eRender, ERole.eMultimedia, out speakers); 

      // activate the session manager. we need the enumerator 
      Guid IID_IAudioSessionManager2 = typeof(IAudioSessionManager2).GUID; 
      object o; 
      speakers.Activate(ref IID_IAudioSessionManager2, 0, IntPtr.Zero, out o); 
      IAudioSessionManager2 mgr = (IAudioSessionManager2)o; 

      // enumerate sessions for on this device 
      IAudioSessionEnumerator sessionEnumerator; 
      mgr.GetSessionEnumerator(out sessionEnumerator); 
      int count; 
      sessionEnumerator.GetCount(out count); 

      // search for an audio session with the required name 
      // NOTE: we could also use the process id instead of the app name (with IAudioSessionControl2) 
      ISimpleAudioVolume volumeControl = null; 
      for (int i = 0; i < count; i++) 
      { 
       IAudioSessionControl ctl; 
       sessionEnumerator.GetSession(i, out ctl); 
       string dn; 
       ctl.GetDisplayName(out dn); 
       if (string.Compare(name, dn, StringComparison.OrdinalIgnoreCase) == 0) 
       { 
        volumeControl = ctl as ISimpleAudioVolume; 
        break; 
       } 
       Marshal.ReleaseComObject(ctl); 
      } 
      Marshal.ReleaseComObject(sessionEnumerator); 
      Marshal.ReleaseComObject(mgr); 
      Marshal.ReleaseComObject(speakers); 
      Marshal.ReleaseComObject(deviceEnumerator); 
      return volumeControl; 
     } 
    } 

    [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("77AA99A0-1BD6-484F-8BC7-2C654C9A9B6F"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] 
    internal interface IAudioSessionManager2 
    { 
     int NotImpl1(); 
     int NotImpl2(); 

     [PreserveSig] 
     int GetSessionEnumerator(out IAudioSessionEnumerator SessionEnum); 

     // 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 IAudioSessionControl Session); 
    } 

    [Guid("F4B1A599-7266-4319-A8CA-E70ACB11E8CD"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] 
    internal interface IAudioSessionControl 
    { 
     int NotImpl1(); 

     [PreserveSig] 
     int GetDisplayName([MarshalAs(UnmanagedType.LPWStr)] out string pRetVal); 

     // the rest is not implemented 
    } 

    [Guid("87CE5498-68D6-44E5-9215-6DA47EF883D8"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] 
    internal interface ISimpleAudioVolume 
    { 
     [PreserveSig] 
     int SetMasterVolume(float fLevel, ref Guid EventContext); 

     [PreserveSig] 
     int GetMasterVolume(out float pfLevel); 

     [PreserveSig] 
     int SetMute(bool bMute, ref Guid EventContext); 

     [PreserveSig] 
     int GetMute(out bool pbMute); 
    } 
} 

注:我没有完全定义接口,只有代码工作需要什么。

+0

如何更改此代码,以便更改Spotify的音量? – joostmakaay

+5

也许你可以尝试使用“Spotify”而不是“Mozilla Firefox” –

+1

已经尝试过,但音量混音器不会为Spotify返回一个“DisplayName”,它只对Firefox和某种类型的.dll – joostmakaay