2014-01-25 71 views
5

如何使用powershell設置揚聲器音量?我在這裏和其他地方在網上找到答案。從PowerShell更改音頻級別?

我想我將不得不在C#中編寫一些包裝Win32 API的東西,然後從我的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-我靜音,取消靜音,我的聲音從 - PowerShell中/ 19348221#19348221)。還有更多的信息。 – Mica

+0

感謝這段偉大的代碼!與Win10非常相稱 – MKANET

7

我們可以使用這些命令將揚聲器靜音,音量降低,音量調高。可以添加一個簡單的1..50循環(每個計數器= 2%的音量)來創建一個接受輸入並調整音量的功能,而無需使用C#。

音量靜音

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

音量鍵

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

音量鍵

$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

編輯:這是一個可重複使用的功能,測試和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 

和這個函數將肘節靜音

Function Toggle-Mute(){$wshShell = new-object -com wscript.shell;$wshShell.SendKeys([char]173)} 
#