You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无第三方应用时,如何通过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. 下班自动静音任务

  1. 打开任务计划程序,点击「创建基本任务」
  2. 填写名称(如「下班自动静音」)和描述,点击下一步
  3. 触发器选择「每天」,设置你的下班时间(比如18:00),点击下一步
  4. 操作选择「启动程序」,程序/脚本填写powershell.exe,添加参数填写:
    -ExecutionPolicy Bypass -WindowStyle Hidden -Command "这里替换为上面的静音命令内容"
    
  5. 完成后,进入任务属性,勾选「不管用户是否登录都要运行」,并设置「使用最高权限运行」

2. 上班取消静音任务

重复上述步骤,创建另一个任务:

  • 触发器设置为上班时间(比如9:00)
  • 启动程序参数替换为取消静音的命令内容
  • 同样勾选「不管用户是否登录都要运行」和「最高权限运行」

注意事项

  • 所有命令均为原生PowerShell调用系统API,无需安装任何第三方软件,适配工作电脑权限限制
  • 如果切换静音的命令偶尔失效,优先使用精准控制的第二段命令,确保状态正确
  • 任务计划的「不管用户是否登录都要运行」设置是关键,因为你保持电脑登录状态,这个设置能保证任务按时执行

内容的提问来源于stack exchange,提问作者KushielAOC

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 01:24:53