2014-06-13 8 views
6

Sono nuovo a PowerShell e ho giocato con esso ultimamente.Come silenziare un'applicazione con PowerShell

La mia domanda è, come si disattiva un'applicazione specifica con PowerShell? Ad esempio, se guardo un video di YouTube in Chrome, posso disattivare l'audio di Chrome solo andando nel mixer del volume e disattivando il chrome fuori dall'elenco di app. C'è un modo per farlo in PowerShell?

Ho trovato un articolo su come disattivare l'audio ma non un'app specifica.

Change audio level from powershell?

+1

Non PowerShell, ma potrebbe essere utile in ogni caso: http://www.nirsoft.net/utils/nircmd.html NirCmd offre un comando per disattivare un'apposita applicazione. –

+1

Simon Mourier ha pubblicato un'applicazione scritta in C# [qui] (http://stackoverflow.com/a/14322736/1001100). Puoi vedere cosa ha fatto nella funzione GetVolumeObject e adattarlo a PowerShell. – JamesQMurphy

+1

... o semplicemente utilizzare lo stesso metodo da PowerShell dopo aver usato 'Aggiungi tipo '. – Joey

risposta

1

ho avvolto l'esempio dell'applicazione pubblicato here in un piccolo powershell-script, in modo che possa essere utilizzato facilmente da Powershell, utilizzando i metodi statici. Questo dovrebbe essere quello che stai cercando, purché tu specifichi il nome app corretto.

Esempio: codice

[SetAppVolume.AppMuter]::Mute("Mozilla Firefox"); 

Esempio:

$def = @" 
using System; 
using System.Runtime.InteropServices; 
using System.Collections.Generic; 

namespace SetAppVolume 
{ 
    public class AppMuter 
    { 
     public static void Mute(string app) 
     { 
      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); 
    } 
} 
"@; 


Add-Type -TypeDefinition $def -Language CSharpVersion3 
# Example usage 
[SetAppVolume.AppMuter]::Mute("Mozilla Firefox"); 
+0

Quando voglio silenziare qualche altra applicazione rispetto a ff. L'output è: nome: Nome: Nome: Mozilla Firefox nome: Nome: @% SystemRoot% \ System32 \ Audiosrv.dll, -202 nome: Nome: – Motte001

Problemi correlati