如何用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
相关产品推荐
相关产品推荐

