无第三方应用时,如何通过CMD/PowerShell结合任务计划程序定时开关系统声音?
用PowerShell+任务计划程序解决自动音量控制问题
一、核心命令(无需第三方工具)
自动静音命令
这段PowerShell通过调用系统原生API切换静音状态,执行后如果当前未静音则会自动静音:
Add-Type @" using System.Runtime.InteropServices; public class Audio { [DllImport("user32.dll")] public static extern bool SendMessageW(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam); [DllImport("user32.dll")] public static extern IntPtr FindWindowW(string lpClassName, string lpWindowName); } "@ $hwnd = [Audio]::FindWindowW("Shell_TrayWnd", $null) [Audio]::SendMessageW($hwnd, 0x0319, [IntPtr]0x00000002, [IntPtr]0)
强制取消静音并设置音量
如果需要确保上班时恢复正常音量(避免之前已经静音的情况),用这段命令精准控制静音状态和音量(示例设置为50%,可调整0.5为0.0-1.0之间的值):
Add-Type @" using System; using System.Runtime.InteropServices; public class AudioControl { [Guid("5CDF2C82-841E-4546-9722-0CF74078229A"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] interface IAudioEndpointVolume { int NotImpl1(); int NotImpl2(); int GetMasterVolumeLevel(out float level); int SetMasterVolumeLevel(float level, Guid pguidEventContext); int GetMasterVolumeLevelScalar(out float level); int SetMasterVolumeLevelScalar(float level, Guid pguidEventContext); int GetChannelCount(out int count); int GetChannelVolumeLevel(int channel, out float level); int SetChannelVolumeLevel(int channel, float level, Guid pguidEventContext); int GetChannelVolumeLevelScalar(int channel, out float level); int SetChannelVolumeLevelScalar(int channel, float level, Guid pguidEventContext); int GetMute(out bool mute); int SetMute(bool mute, Guid pguidEventContext); int GetVolumeStepInfo(out int step, out int stepCount); int VolumeStepUp(Guid pguidEventContext); int VolumeStepDown(Guid pguidEventContext); int QueryHardwareSupport(out int hardwareSupportMask); int GetVolumeRange(out float minLevel, out float maxLevel, out float step); } [Guid("D666063F-1587-4E43-81F1-B948E807363F"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] interface IMMDeviceEnumerator { int NotImpl1(); int GetDefaultAudioEndpoint(int dataFlow, int role, out IMMDevice ppDevice); } [Guid("A95664D2-9614-4F35-A746-DE8DB63617E6"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] interface IMMDevice { int Activate(ref Guid iid, int dwClsCtx, IntPtr pActivationParams, out object ppInterface); } [ComImport, Guid("BCDE0395-E52F-467C-8E3D-C4579291692E")] class MMDeviceEnumeratorComObject { } public static void SetMute(bool mute) { var enumerator = new MMDeviceEnumeratorComObject() as IMMDeviceEnumerator; enumerator.GetDefaultAudioEndpoint(0, 1, out var device); var iid = typeof(IAudioEndpointVolume).GUID; device.Activate(ref iid, 0x17, IntPtr.Zero, out var volumeObj); var volume = volumeObj as IAudioEndpointVolume; volume.SetMute(mute, Guid.Empty); Marshal.ReleaseComObject(volume); Marshal.ReleaseComObject(device); Marshal.ReleaseComObject(enumerator); } public static void SetVolumeScalar(float level) { var enumerator = new MMDeviceEnumeratorComObject() as IMMDeviceEnumerator; enumerator.GetDefaultAudioEndpoint(0, 1, out var device); var iid = typeof(IAudioEndpointVolume).GUID; device.Activate(ref iid, 0x17, IntPtr.Zero, out var volumeObj); var volume = volumeObj as IAudioEndpointVolume; volume.SetMasterVolumeLevelScalar(level, Guid.Empty); Marshal.ReleaseComObject(volume); Marshal.ReleaseComObject(device); Marshal.ReleaseComObject(enumerator); } } "@ # 取消静音 [AudioControl]::SetMute($false) # 设置音量为50%(0.0=静音,1.0=最大音量) [AudioControl]::SetVolumeScalar(0.5)
二、配置任务计划程序
1. 下班自动静音任务
- 打开任务计划程序,点击「创建基本任务」
- 填写名称(如「下班自动静音」)和描述,点击下一步
- 触发器选择「每天」,设置你的下班时间(比如18:00),点击下一步
- 操作选择「启动程序」,程序/脚本填写
powershell.exe,添加参数填写:-ExecutionPolicy Bypass -WindowStyle Hidden -Command "这里替换为上面的静音命令内容" - 完成后,进入任务属性,勾选「不管用户是否登录都要运行」,并设置「使用最高权限运行」
2. 上班取消静音任务
重复上述步骤,创建另一个任务:
- 触发器设置为上班时间(比如9:00)
- 启动程序参数替换为取消静音的命令内容
- 同样勾选「不管用户是否登录都要运行」和「最高权限运行」
注意事项
- 所有命令均为原生PowerShell调用系统API,无需安装任何第三方软件,适配工作电脑权限限制
- 如果切换静音的命令偶尔失效,优先使用精准控制的第二段命令,确保状态正确
- 任务计划的「不管用户是否登录都要运行」设置是关键,因为你保持电脑登录状态,这个设置能保证任务按时执行
内容的提问来源于stack exchange,提问作者KushielAOC
相关产品推荐
相关产品推荐

