我怎么能静音/取消我的声音从PowerShell
-
05-07-2019 - |
题
尝试写一PowerShell命令,将哑的声音在开始,除非已经柔和,并且联合国的静音结束时(仅如果它不是静音开始与)。找不到任何PoweShell或WMI对象我可以使用。我是在玩弄使用Win32功能喜欢 auxGetVolume 或 auxSetVolume, 但不能完全得到它的工作(如何阅读值因此?).
我使用的V2CTP2.任何想法伙计?
谢谢!
解决方案
似乎没有一种快速简便的方法来调整音量。如果你有c ++经验,你可以用这篇博客文章,其中Larry Osterman描述了如何调用来自平台api的IAudioEndpointVolume接口(对于Vista,XP可能比我在几次搜索中发现的更难)。
V2允许您编译内联代码(通过Add-Type),因此这可能是一个选项。
其他提示
从Vista开始,你必须使用 Core Audio API 来控制系统音量。它是一个不支持自动化的COM API,因此需要从.NET和PowerShell中使用大量的样板。
无论如何,下面的代码允许您从PowerShell访问 [Audio] :: Volume
和 [Audio] :: Mute
属性。这也适用于可能有用的远程计算机。只需在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:\>
如果您需要Core Audio API,还有更全面的.NET包装器,但我不知道有一组PowerShell友好的cmdlet。
P.S。 Diogo答案似乎很聪明,但对我来说无效。
在ps1 powershell脚本上使用以下命令:
$obj = new-object -com wscript.shell
$obj.SendKeys([char]173)
亚历山大的答案符合我的情况,但由于关于'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:\>
如果您可以在C#中执行此操作,则可以在PowerShell中执行。
只需管理Windows音频服务,您就可以通过另一种方式为猫咪换肤。停止它静音,启动它取消静音。
我没有在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,但结合的答案,从迈克尔和迪奥戈*提供一线VBScript解决方案:
CreateObject("WScript.Shell").SendKeys(chr(173))
就打这 mute.vbs
, 和你可以双击切换静
- 仍然在Windows10(10586.104)
- 没有必要
Set-ExecutionPolicy
正如你可能with advanced
Set-DefaultAudioDeviceMute