Comment puis-je utiliser PowerShell pour régler le volume des haut-parleurs? J'ai fouillé ici et ailleurs en ligne ne peut pas vraiment trouver une réponse.
Je pense que je vais devoir écrire quelque chose en C # qui enveloppe une API Win32 et ALORS l'appeler depuis mon script powershell. L'API Win32 serait l'un de ceux-ci
[DllImport("winmm.dll")]
public static extern int waveOutGetVolume(IntPtr hwo, out uint dwVolume);
[DllImport("winmm.dll")]
public static extern int waveOutSetVolume(IntPtr hwo, uint dwVolume);
SendKeys a cessé de fonctionner pour moi dans Windows 10 (il tape littéralement les chiffres où se trouve mon curseur). J'ai trouvé cet article de blog avec un moyen très pratique de le faire.
Tout d’abord, lancez ceci pour avoir accès à l’API audio:
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)); }
}
}
'@
Puis contrôlez le volume comme ceci:
[audio]::Volume = 0.2 # 0.2 = 20%, etc.
Et muet/non muet comme ça:
[audio]::Mute = $true # Set to $false to un-mute
J'ai créé une cmdlet pour manipuler des périphériques audio.
http://www.automatedops.com/projects/windowsaudiodevice-powershell-cmdlet/
Il comprend même un affichage en direct de la valeur de pointe.
Nous pouvons activer les niveaux de haut-parleur muet, volume bas, volume haut avec ces commandes. Une simple boucle 1..50
(chaque compteur = 2% du volume) peut être ajoutée pour créer une fonction qui accepte les entrées et ajuste le volume sans avoir besoin de C #.
Volume muet
$obj = new-object -com wscript.Shell
$obj.SendKeys([char]173)
Bouton de réduction du volume
$obj = new-object -com wscript.Shell
$obj.SendKeys([char]174)
Bouton d'augmentation du volume
$obj = new-object -com wscript.Shell
$obj.SendKeys([char]175)
Trouvez des informations pertinentes ici.
Comment puis-je désactiver/réactiver le son de PowerShell
EDIT: Voici une fonction réutilisable, testée et fonctionnant sur W7x64 avec Powershell v2.
Function Set-Speaker($Volume){$wshShell = new-object -com wscript.Shell;1..50 | % {$wshShell.SendKeys([char]174)};1..$Volume | % {$wshShell.SendKeys([char]175)}}
#
Exemple d'utilisation. Rappelez-vous que chaque tick est 2%
#Sets volume to 60%
Set-Speaker -Volume 30
#Sets volume to 80%
Set-Speaker -Volume 40
#Sets volume to 100%
Set-Speaker -Volume 50
et cette fonction bascule-muet
Function Toggle-Mute(){$wshShell = new-object -com wscript.Shell;$wshShell.SendKeys([char]173)}
#
Découvrez ce script de contrôle du volume PC sur TechNet . Il prétend faire ce que vous demandez, du moins sous Windows XP. Voici une autre approche qui utilise un outil appelé NirCmd .