2014-01-25 5 views
5

Как использовать powershell для установки громкости динамика? Ive, копавшийся здесь и в другом месте в Интернете, не может найти ответ.Изменить уровень звука из PowerShell?

Я думаю, что мне нужно будет написать что-то на C#, которое обертывает Win32 API, а THEN вызывает его из моего сценария powershell. Win32 API будет одним из этих

[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); 
+0

Вы используете неправильный API для этого из vista/W7 или выше (но правильно для XP. Если на vista/W7 или выше посмотрите в EndpointVolume http://msdn.microsoft.com/en-us/library/ms678715.aspx –

ответ

10

SendKeys перестал работать для меня в Windows 10 (это буквально типы цифр, где моя каретка). Я нашел this blog post с очень удобным способом сделать это.

Во-первых, запустить этот, чтобы получить доступ к аудио API:

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

Затем регулировать громкость, как это:

[audio]::Volume = 0.2 # 0.2 = 20%, etc. 

И включение/отключение звука, как это:

[audio]::Mute = $true # Set to $false to un-mute 
+3

Это решение изначально появилось из [этого сообщения переполнения стека] (http://stackoverflow.com/questions/255419/how-can- я-немой-Unmute-мой-звук из-PowerShell/19348221 # 19348221). Там еще немного информации. – Mica

+0

Спасибо за этот замечательный кусок кода! Отлично работает с Win10 – MKANET

7

Мы можем отключить звук, уменьшить громкость, громкость Уровни громкоговорителей с помощью этих команд. Простой цикл 1..50 (каждый счетчик = 2% громкости) может быть добавлен для создания функции, которая принимает входные данные и регулирует громкость без необходимости использования C#.

Отключение звука

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

Volume Down Button

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

Volume Up Button

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

Найти некоторую соответствующую информацию здесь.

How can I mute/unmute my sound from PowerShell

http://blogs.technet.com/b/heyscriptingguy/archive/2013/07/28/weekend-scripter-cheesy-script-to-set-speaker-volume.aspx

EDIT: Вот является многоразовой функцией, испытаны и работает на W7x64 ж/Powershell v2.

Function Set-Speaker($Volume){$wshShell = new-object -com wscript.shell;1..50 | % {$wshShell.SendKeys([char]174)};1..$Volume | % {$wshShell.SendKeys([char]175)}} 
# 

Пример использования. Помните, каждый тик составляет 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 

и эта функция Переключите-Mute

Function Toggle-Mute(){$wshShell = new-object -com wscript.shell;$wshShell.SendKeys([char]173)} 
# 
Смежные вопросы