Как отключить звук / отключить звук от PowerShell

Попытка написать командлет PowerShell, который отключит звук при запуске, если он уже не отключен, и отключить его в конце (только если он не был приглушен для начала). Не удалось найти объект PoweShell или WMI, который я мог бы использовать. Я играл с использованием функций Win32, таких как auxGetVolume или auxSetVolume , но не мог заставить его работать (как читать значения из IntPtr?).

Я использую V2 CTP2. Любые идеи?

Благодаря!

    Кажется, что нет быстрого и легкого способа регулировки громкости. Если у вас есть опыт работы на C ++, вы можете что-то сделать с этим сообщением в блоге , где Ларри Остерман описывает, как вызвать интерфейс IAudioEndpointVolume с платформы api (для Vista, XP может быть сложнее из того, что я нашел в нескольких поисках).

    V2 позволяет вам скомпилировать встроенный код (через Add-Type), так что это может быть опция.

    Начиная с Vista вы должны использовать Core Audio API для управления объемом системы. Это COM API, который не поддерживает автоматизацию и, следовательно, требует много шаблонов для использования с .NET и PowerShell.

    В любом случае приведенный ниже код позволит вам получить доступ к свойствам [Audio]::Volume и [Audio]::Mute из PowerShell. Это также работает на удаленном компьютере, который может быть полезен. Просто скопируйте код в окно 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)); } } } '@ 

    Пример использования:

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

    Есть более обширные .NET-оболочки для Core Audio API, если вам это нужно, но я не знаю о наборе дружественных командлетов PowerShell.

    Ответ PS Diogo кажется умным, но он не работает для меня.

    Используйте следующие команды сценария powershell ps1:

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

    Вы можете обманывать кошку другим способом, просто управляя Службой Windows Audio. Остановите его, чтобы отключить звук, и включите его.

    Если вы можете сделать это на C # , вы можете сделать это в PowerShell .

    Ответ Alexandre соответствует моей ситуации, но его пример не работает из-за ошибок компиляции в пространстве имен «var». Кажется, что новые / разные версии .net могут привести к тому, что пример не работает. Если вы обнаружили, что получили ошибки компиляции, это альтернативная версия, чтобы попробовать в этих случаях:

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

    Использование такое же:

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

    Я не нашел, как это сделать в PowerShell, но есть утилита командной строки под названием NirCmd, которая сделает трюк, выполнив эту команду:

    C: \ utils \ nircmd.exe mutesysvolume 2

    NirCmd можно бесплатно скачать здесь: http://www.nirsoft.net/utils/nircmd.html

    Решение в vbscript:

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

    Клавиши уменьшают громкость на 2 каждый раз.

    Я знаю, что это не PowerShell, но сочетание ответов от Michael и Diogo дает однострочное решение VBScript:

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

    mute.vbs это в mute.vbs , и вы можете просто дважды щелкнуть, чтобы отключить звук

    • все еще работает в Windows 10 (10586.104)
    • нет необходимости в Set-ExecutionPolicy как вы могли бы с PowerShell

    Проверьте мой ответ на Изменить уровень звука из PowerShell?

     Set-DefaultAudioDeviceMute 
    Interesting Posts

    OAuth с проверкой в ​​.NET.

    Преобразование списка кадров данных в один фрейм данных

    Свойства vs Методы

    Виртуальные хосты Apache2 не распознают должным образом

    Как настроить ноутбук Windows 7 как точку доступа Bluetooth?

    Распространение Anaconda Ошибка Python

    Как удалить пробел из числа

    Как я могу удалить устройство вывода приложения Boom из своей системы?

    Отменить колонку кадра данных, сохраняя информацию из другого столбца

    Как распечатать большую веб-страницу на одностраничном pdf с настраиваемыми параметрами?

    Как закрыть окно поиска в Firefox с помощью сочетания клавиш, когда это поле не в фокусе?

    В чем разница между анонимными методами (C # 2.0) и lambda-выражениями (C # 3.0)?

    Общее решение Ruby для SQLite3 «LIKE» или PostgreSQL «ИЛИКЕ»?

    Добавление расширяемогоListView в NavigationView

    Может ли код, который действителен как в C, так и в C ++, создает другое поведение при компиляции на каждом языке?

    Давайте будем гением компьютера.