How can I mute/unmute my sound from PowerShell

后端 未结 10 2076
孤独总比滥情好
孤独总比滥情好 2020-11-29 06:14

Trying to write a PowerShell cmdlet that will mute the sound at start, unless already muted, and un-mute it at the end (only if it wasn\'t muted to begin with). Couldn\'t fi

相关标签:
10条回答
  • 2020-11-29 06:29

    There does not seem to be a quick and easy way to adjust the volume.. If you have c++ experience, you could do something with this blog post, where Larry Osterman describes how to call the IAudioEndpointVolume interface from the platform api(for Vista, XP might be more difficult from what I've found in a few searches).

    V2 does allow you to compile inline code (via Add-Type), so that might be an option.

    0 讨论(0)
  • 2020-11-29 06:29

    Use the following commands on a ps1 powershell script:

    $obj = new-object -com wscript.shell 
    $obj.SendKeys([char]173)
    
    0 讨论(0)
  • 2020-11-29 06:31

    I know it isn't PowerShell, but combining the answers from Michael and Diogo gives a one-line VBScript solution:

    CreateObject("WScript.Shell").SendKeys(chr(173))
    

    Slap this in mute.vbs, and you can just double-click to toggle mute

    • still works in Windows 10 (10586.104)
    • no need to Set-ExecutionPolicy as you might with PowerShell
    0 讨论(0)
  • 2020-11-29 06:35

    You could skin the cat another way by simply managing the Windows Audio Service. Stop it to mute, start it to unmute.

    0 讨论(0)
  • 2020-11-29 06:37

    Check out my answer to Change audio level from powershell?

    Set-DefaultAudioDeviceMute
    
    0 讨论(0)
  • 2020-11-29 06:38

    Alexandre's answer fit my situation, but his example does not work due to compilation errors regarding the namespace of 'var'. It seems that newer/different versions of .net may cause the example not to work. If you found that you received compilation errors, this is an alternative version to try for those cases:

    Add-Type -Language CsharpVersion3 -TypeDefinition @'
    using System.Runtime.InteropServices;
    
    [Guid("5CDF2C82-841E-4546-9722-0CF74078229A"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    interface IAudioEndpointVolume {
      // f(), g(), ... are unused COM method slots. Define these if you care
      int f(); int g(); int h(); int i();
      int SetMasterVolumeLevelScalar(float fLevel, System.Guid pguidEventContext);
      int j();
      int GetMasterVolumeLevelScalar(out float pfLevel);
      int k(); int l(); int m(); int n();
      int SetMute([MarshalAs(UnmanagedType.Bool)] bool bMute, System.Guid pguidEventContext);
      int GetMute(out bool pbMute);
    }
    [Guid("D666063F-1587-4E43-81F1-B948E807363F"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    interface IMMDevice {
      int Activate(ref System.Guid id, int clsCtx, int activationParams, out IAudioEndpointVolume aev);
    }
    [Guid("A95664D2-9614-4F35-A746-DE8DB63617E6"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    interface IMMDeviceEnumerator {
      int f(); // Unused
      int GetDefaultAudioEndpoint(int dataFlow, int role, out IMMDevice endpoint);
    }
    [ComImport, Guid("BCDE0395-E52F-467C-8E3D-C4579291692E")] class MMDeviceEnumeratorComObject { }
    
    public class Audio {
      static IAudioEndpointVolume Vol() {
        var enumerator = new MMDeviceEnumeratorComObject() as IMMDeviceEnumerator;
        IMMDevice dev = null;
        Marshal.ThrowExceptionForHR(enumerator.GetDefaultAudioEndpoint(/*eRender*/ 0, /*eMultimedia*/ 1, out dev));
        IAudioEndpointVolume epv = null;
        var epvid = typeof(IAudioEndpointVolume).GUID;
        Marshal.ThrowExceptionForHR(dev.Activate(ref epvid, /*CLSCTX_ALL*/ 23, 0, out epv));
        return epv;
      }
      public static float Volume {
        get {float v = -1; Marshal.ThrowExceptionForHR(Vol().GetMasterVolumeLevelScalar(out v)); return v;}
        set {Marshal.ThrowExceptionForHR(Vol().SetMasterVolumeLevelScalar(value, System.Guid.Empty));}
      }
      public static bool Mute {
        get { bool mute; Marshal.ThrowExceptionForHR(Vol().GetMute(out mute)); return mute; }
        set { Marshal.ThrowExceptionForHR(Vol().SetMute(value, System.Guid.Empty)); }
      }
    }
    '@
    

    Usage is the same:

    PS C:\> [Audio]::Volume         # Check current volume (now about 10%)
    0,09999999
    PS C:\> [Audio]::Mute           # See if speaker is muted
    False
    PS C:\> [Audio]::Mute = $true   # Mute speaker
    PS C:\> [Audio]::Volume = 0.75  # Set volume to 75%
    PS C:\> [Audio]::Volume         # Check that the changes are applied
    0,75
    PS C:\> [Audio]::Mute
    True
    PS C:\>
    
    0 讨论(0)
提交回复
热议问题