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

如何用C#开发UWP应用,在通话接通时暂停Windows系统所有声音

实现UWP应用通话自动暂停系统声音

核心思路

通过监听系统中通信类音频会话的激活状态(Google Meet、Zoom等通话软件默认使用该类别),当检测到通话会话启动时,暂停/静音系统全局声音;通话结束后恢复声音。若部分软件未严格遵循通信类别规范,可结合进程名称辅助判断。

具体实现步骤

1. 配置应用权限

在Package.appxmanifest中添加必要权限:

  • microphone(可选,辅助检测麦克风激活状态)
  • backgroundMediaPlayback(需后台持续监听时配置)
  • internetClient(部分场景下需要)

2. 监听通话音频会话状态

使用AudioSessionManager2获取系统音频会话,监听会话创建及状态变化事件:

using Windows.Media.Audio;
using Windows.Media.Devices;
using System.Linq;

private AudioSessionManager2 _sessionManager;
private AudioSessionControl2 _activeCallSession;

private async Task InitializeSessionListener()
{
    // 获取默认音频渲染设备的会话管理器
    var defaultRenderDeviceId = MediaDevice.GetDefaultAudioRenderId(AudioDeviceRole.Default);
    _sessionManager = await AudioSessionManager2.CreateAsync(defaultRenderDeviceId);

    // 监听新会话创建事件
    _sessionManager.SessionCreated += OnSessionCreated;

    // 遍历现有会话,检查是否存在已激活的通话会话
    foreach (var session in _sessionManager.GetSessionEnumerator())
    {
        var sessionControl = session as AudioSessionControl2;
        if (IsCallSession(sessionControl))
        {
            sessionControl.StateChanged += OnCallSessionStateChanged;
            _activeCallSession = sessionControl;
        }
    }
}

// 判断是否为目标通话软件的会话
private bool IsCallSession(AudioSessionControl2 sessionControl)
{
    if (sessionControl == null) return false;
    
    // 优先匹配通信类别
    if (sessionControl.SessionCategory == AudioSessionCategory.Communications)
        return true;
    
    // 补充匹配进程名称(应对不规范的软件)
    var targetProcesses = new[] { "Zoom.exe", "chrome.exe", "msedge.exe" };
    return targetProcesses.Contains(sessionControl.ProcessName, StringComparer.OrdinalIgnoreCase);
}

private void OnSessionCreated(AudioSessionManager2 sender, AudioSessionCreatedEventArgs args)
{
    var sessionControl = args.Session as AudioSessionControl2;
    if (IsCallSession(sessionControl))
    {
        sessionControl.StateChanged += OnCallSessionStateChanged;
        _activeCallSession = sessionControl;
    }
}

private void OnCallSessionStateChanged(AudioSessionControl2 sender, AudioSessionStateChangedEventArgs args)
{
    switch (args.NewState)
    {
        case AudioSessionState.Active:
            // 通话接通,执行暂停操作
            PauseSystemAudio();
            break;
        case AudioSessionState.Inactive:
        case AudioSessionState.Exited:
            // 通话结束,恢复声音
            ResumeSystemAudio();
            _activeCallSession = null;
            sender.StateChanged -= OnCallSessionStateChanged;
            break;
    }
}

3. 控制系统声音的两种方式

方式1:全局静音系统音量

直接控制系统全局音量的静音状态:

using Windows.Media.Devices;

private void PauseSystemAudio()
{
    var audioDeviceManager = AudioDeviceManager.CreateDefaultAudioRenderDeviceManager();
    audioDeviceManager.SetMute(true);
}

private void ResumeSystemAudio()
{
    var audioDeviceManager = AudioDeviceManager.CreateDefaultAudioRenderDeviceManager();
    audioDeviceManager.SetMute(false);
}

方式2:仅暂停非通话类会话

精准暂停除通话外的其他应用音频会话:

private void PauseSystemAudio()
{
    foreach (var session in _sessionManager.GetSessionEnumerator())
    {
        var sessionControl = session as AudioSessionControl2;
        if (sessionControl != null && !IsCallSession(sessionControl))
        {
            sessionControl.Pause();
        }
    }
}

private void ResumeSystemAudio()
{
    foreach (var session in _sessionManager.GetSessionEnumerator())
    {
        var sessionControl = session as AudioSessionControl2;
        if (sessionControl != null && !IsCallSession(sessionControl))
        {
            sessionControl.Resume();
        }
    }
}

4. 处理应用生命周期

在应用启动时初始化监听,挂起时清理资源:

protected override async void OnLaunched(LaunchActivatedEventArgs e)
{
    await InitializeSessionListener();
    // 其他启动逻辑
}

protected override void OnSuspending(object sender, SuspendingEventArgs e)
{
    var deferral = e.SuspendingOperation.GetDeferral();
    
    _sessionManager.SessionCreated -= OnSessionCreated;
    if (_activeCallSession != null)
    {
        _activeCallSession.StateChanged -= OnCallSessionStateChanged;
    }
    
    deferral.Complete();
}

注意事项

  • 若需后台持续监听,需配置音频后台任务,避免应用被系统挂起。
  • 部分小众通话软件可能需要补充进程名称到targetProcesses数组中。
  • 测试时需确保通话软件已开启通话,触发音频会话状态切换。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 01:53:29