【发布时间】:2015-05-01 06:36:39
【问题描述】:
背景
我需要在软件电话应用程序中显示已连接耳机(组合麦克风和耳机)的列表。为了测试,我有以下设备:
- Jabra PRO 9470
- 缤特力 BT300M
- 罗技 G430 游戏耳机
用户应该能够从ComboBox 中选择耳机,而无需单独选择麦克风和耳机。
信息
我知道在哪里可以找到有关麦克风和耳机的信息(在 Windows 中),但我无法使用 WMI 或 MMDevice API 获得它。
要查找信息,请右键单击任务栏右侧的Sound(扬声器图标)并选择Playback devices。
- 双击或点击
Properties打开属性窗口。 - 单击属性窗口上的
Properties按钮。 - 单击
Details选项卡并在ComboBox中找到Children属性。
这将为我提供以下信息:
SWD\MMDEVAPI\{0.0.0.00000000}.{f2e09e37-8389-46c4-8b2b-53e08b874399}
SWD\MMDEVAPI\{0.0.1.00000000}.{3402ee6e-d862-47ca-8ab8-bb8254216032}
第一行匹配我的Headset Earphone (Jabra PRO 9470) 和第二行Headset Microphone (Jabra PRO 9470)。
为了在 C# 中获得相同的信息,我循环通过 Win32_USBControllerDevice 类并输出包含“MMDEVAPI”的所有值。在我的 PC 上,它将返回 6 个值(3 个麦克风,3 个耳机)。
foreach (var device in new ManagementObjectSearcher("SELECT * FROM Win32_USBControllerDevice").Get())
{
foreach (var property in device.Properties)
{
// Gets the value of the property on the device.
var value = property.Value == null ? string.Empty : property.Value.ToString();
if (value.IndexOf("mmdevapi", StringComparison.OrdinalIgnoreCase) > -1)
{
// Output connected USB microphones and earphones.
Console.WriteLine(property.Value);
}
}
}
供参考,上面的代码会输出:
\\PC9018\root\cimv2:Win32_PnPEntity.DeviceID="SWD\\MMDEVAPI\\{0.0.0.00000000}.{F2E09E37-8389-46C4-8B2B-53E08B874399}"
\\PC9018\root\cimv2:Win32_PnPEntity.DeviceID="SWD\\MMDEVAPI\\{0.0.1.00000000}.{3402EE6E-D862-47CA-8AB8-BB8254216032}"
\\PC9018\root\cimv2:Win32_PnPEntity.DeviceID="SWD\\MMDEVAPI\\{0.0.0.00000000}.{985F2B5C-2EE2-4733-BBD6-48BFDE2D5582}"
\\PC9018\root\cimv2:Win32_PnPEntity.DeviceID="SWD\\MMDEVAPI\\{0.0.1.00000000}.{71D824EA-DAE9-4F0D-B673-4425385E3777}"
\\PC9018\root\cimv2:Win32_PnPEntity.DeviceID="SWD\\MMDEVAPI\\{0.0.0.00000000}.{D29C0970-D515-4F91-9924-F0063CF1A196}"
\\PC9018\root\cimv2:Win32_PnPEntity.DeviceID="SWD\\MMDEVAPI\\{0.0.1.00000000}.{C4B331E2-C56B-4D9B-A486-2ED6C11FDB8C}"
问题
我现在最大的问题是,如何将正确的耳机麦克风和耳机关联到Headset 对象?
尝试
我曾尝试在 Google 和 StackOverflow 上搜索答案或提示,但使用 WMI 或 MMDevice API 找不到麦克风和耳机之间的任何共同点或关系。
如果有办法创建Dictionary<string, List<string>>,其中Key 是物理设备或USB 端口独有的,而Value 是关联Win32_PnPEntity.DeviceID 的列表,那么我找不到它。
本着几天后星球大战日的精神:“帮帮我,StackOverflow。你是我唯一的希望。”
【问题讨论】:
标签: c# .net wmi microphone headset