2008-11-01 3 views
14

Vous essayez d'écrire une applet de commande PowerShell qui coupe le son au démarrage, sauf si elle est déjà coupée, et la désactiver à la fin (uniquement si elle n'a pas été désactivée au début). Impossible de trouver un objet PoweShell ou WMI que je pourrais utiliser. Je jouais avec l'aide de fonctions Win32 comme auxGetVolume ou auxSetVolume, mais ne pouvait pas tout à fait le faire fonctionner (comment lire les valeurs d'un IntPtr?). J'utilise V2 CTP2. Des gens d'idées?Comment puis-je activer/désactiver le son de PowerShell

Merci!

+0

Question intéressante! –

+0

Avez-vous vu cette question (elle se déclenche au bip, mais je ne sais pas de quoi vous parlez)? http://stackoverflow.com/questions/252799/turning-off-the-cmd-window-beep-sound – Ady

Répondre

5

Il ne semble pas y avoir un moyen rapide et facile d'ajuster le volume .. Si vous avez une expérience C++, vous pouvez faire quelque chose avec this blog post, où Larry Osterman décrit comment appeler l'interface IAudioEndpointVolume à partir de l'API api (pour Vista, XP pourrait être plus difficile d'après ce que j'ai trouvé dans quelques recherches). V2 ne vous permet de compiler le code en ligne (via Add-Type), ce qui pourrait être une option.

5

Vous pouvez peaufiner le chat autrement en gérant simplement le service audio Windows. Arrêtez-le pour couper le son, démarrez-le pour le désactiver.

+0

Ceci est l'option la plus simple que j'ai trouvé dans ma recherche aujourd'hui +1. "net stop" Windows Audio " – miltonb

+1

En PowerShell: Stop-Service -DisplayName" Windows Audio "& Start-Service -DisplayName" Windows Audio ".J'ai souhaité y penser plus tôt – Bewc

2

Je ne trouve pas comment faire cela dans PowerShell, mais il est un utilitaire de ligne de commande appelé NirCmd qui fera l'affaire en exécutant cette commande:

C: \ utils \ nircmd.exe mutesysvolume 2

NirCmd est disponible gratuitement ici: http://www.nirsoft.net/utils/nircmd.html

12

Utilisez les commandes suivantes sur un script Powershell ps1:

$obj = new-object -com wscript.shell 
$obj.SendKeys([char]173) 
+0

Pour exécuter avec .bat place ce code dans le fichier et écrit ** powershell.exe -file "C: \ fichier.ps1" ** –

2

Solution dans vbscript:

Set WshShell = CreateObject("WScript.Shell") 
For i = 0 To 50 
    WshShell.SendKeys(chr(174)) 
    WScript.Sleep 100 
Next 

Les clés réduisent le volume de 2 à chaque fois.

15

À partir de Vista, vous devez utiliser le Core Audio API pour contrôler le volume du système. C'est une API COM qui ne prend pas en charge l'automatisation et qui nécessite donc beaucoup d'utilisation de .NET et PowerShell.

De toute façon, le code ci-dessous vous permet d'accéder aux propriétés [Audio]::Volume et [Audio]::Mute de PowerShell. Cela fonctionne également sur un ordinateur distant qui pourrait être utile. Il suffit de copier-coller le code dans votre fenêtre PowerShell.

Add-Type -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)); } 
    } 
} 
'@ 

Exemple d'utilisation:

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:\> 

Il enveloppent .NET plus complet là-bas pour l'API Core Audio si vous en avez besoin, mais je ne suis pas au courant d'un ensemble de cmdlets PowerShell amical.

P.S.Diogo answer semble intelligent mais ça ne marche pas pour moi.

2

Je sais que ce n'est pas PowerShell, mais en combinant les réponses de Michael et Diogo donne une solution VBScript une ligne:

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

Slap cette dans mute.vbs, et vous pouvez simplement double-cliquer pour basculer en sourdine

  • toujours ks dans Windows 10 (10586.104)
  • pas besoin de Set-ExecutionPolicy que vous pourriez avec PowerShell
4

réponse d'Alexandre adapter ma situation, mais son exemple ne fonctionne pas en raison d'erreurs de compilation concernant l'espace de noms « var ». Il semble que des versions plus récentes/différentes de .net peuvent faire que l'exemple ne fonctionne pas. Si vous avez trouvé que vous avez reçu des erreurs de compilation, ceci est une version alternative à essayer pour les cas:

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)); } 
    } 
} 
'@ 

L'utilisation est la même:

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:\>