如何在UWP C#中检测麦克风占用状态及占用应用?
检测UWP中占用麦克风的具体应用
要检测哪个应用正在使用麦克风,你可以结合MediaCapture初始化尝试和DeviceInformation属性查询实现,以下是具体方案:
1. 通过MediaCapture捕获失败判断占用状态
当麦克风被其他应用独占使用时,尝试初始化MediaCapture会抛出UnauthorizedAccessException,捕获该异常后即可进一步查询占用应用:
private async Task CheckMicrophoneUsage() { var microphoneDevice = await GetMicrophoneDeviceAsync(); if (microphoneDevice == null || !microphoneDevice.IsEnabled) { await new MessageDialog("未检测到可用麦克风设备").ShowAsync(); return; } MediaCapture tempCapture = null; try { tempCapture = new MediaCapture(); await tempCapture.InitializeAsync(new MediaCaptureInitializationSettings { AudioDeviceId = microphoneDevice.Id, StreamingCaptureMode = StreamingCaptureMode.Audio }); // 初始化成功,说明麦克风未被占用 await new MessageDialog("麦克风当前未被任何应用占用").ShowAsync(); } catch (UnauthorizedAccessException) { // 麦克风被占用,查询具体应用 var appInfo = await GetCurrentMicrophoneUsingAppAsync(microphoneDevice); if (appInfo != null) { await new MessageDialog($"麦克风正在被以下应用占用:\n应用名称:{appInfo.Item1}\n应用ID:{appInfo.Item2}").ShowAsync(); } else { await new MessageDialog("麦克风被占用,但无法获取应用信息").ShowAsync(); } } finally { tempCapture?.Dispose(); } }
2. 查询占用麦克风的应用信息
通过DeviceInformation的属性集合获取当前使用麦克风的应用ID,再通过PackageManager获取对应的应用名称:
private async Task<Tuple<string, string>> GetCurrentMicrophoneUsingAppAsync(DeviceInformation micDevice) { // 获取当前捕获音频的应用ID if (micDevice.Properties.TryGetValue("System.Device.Audio.CurrentCaptureApplication", out var appIdObj) && appIdObj is string appId) { PackageManager packageManager = new PackageManager(); try { var package = await packageManager.FindPackageByIdAsync(appId); return Tuple.Create(package.DisplayName, appId); } catch (Exception) { // 桌面应用无法通过PackageManager获取名称,直接返回ID return Tuple.Create("未知桌面应用", appId); } } return null; }
3. 权限配置
务必在Package.appxmanifest中添加麦克风权限:
<Capabilities> <DeviceCapability Name="microphone" /> </Capabilities>
注意事项
- 该方案可检测大部分UWP应用和Win32应用的麦克风占用情况,部分特殊系统进程可能无法获取完整信息
- 建议降低定时器检测频率(比如10秒一次),避免频繁初始化
MediaCapture影响系统性能
内容的提问来源于stack exchange,提问作者Smit Rathod
相关产品推荐
相关产品推荐

