C# 如何从XAudio2设备详细信息中获取特定pnp扬声器的驱动程序信息

C# 如何从XAudio2设备详细信息中获取特定pnp扬声器的驱动程序信息,c#,audio,wmi,C#,Audio,Wmi,我有一个系统,有两个PnP扬声器插入。它们都是相同类型的设备。一个安装在前部,一个安装在后部。可以让制造商添加一些驱动程序级别id,这样我们就可以知道哪个在哪里。我需要能够通过设置播放的音频输出时获取设备信息来确定我正在查看的设备 当我从XAudio2获取设备信息时: var deviceCount = _xAudio2Instance.DeviceCount; for (int i = 0; i < deviceCount; i++) {

我有一个系统,有两个PnP扬声器插入。它们都是相同类型的设备。一个安装在前部,一个安装在后部。可以让制造商添加一些驱动程序级别id,这样我们就可以知道哪个在哪里。我需要能够通过设置播放的音频输出时获取设备信息来确定我正在查看的设备

当我从XAudio2获取设备信息时:

var deviceCount = _xAudio2Instance.DeviceCount;

        for (int i = 0; i < deviceCount; i++)
        {
            var device = _xAudio2Instances.GetDeviceDetails(i);
            Console.WriteLine("Sound: {0},{1},{2}", device.DeviceId, device.DisplayName, device.Role);
我有以下财产: 设备ID 显示名称 输出格式 角色

对于这两个设备,除了显示名称外,所有内容都是相同的,显示名称将有一个与该实例关联的数字。我们将安装许多这样的设备,所以我不能保证这些数字是一致的

我正在尝试将这个设备实例与一些驱动程序级别的值关联起来,这些值将允许我知道插入了什么物理设备

然后我打算在Win32_SoundDevice或类似的东西上使用一些WMI查询,但我找不到任何从XAudio2设备详细信息到WMI SoundDevice实例的公共链接


任何帮助都将不胜感激。我知道这是可以做到的,因为我看到他们在Windows声音管理中做到了

答案是您需要将设备id映射到注册表,然后将注册表项映射到Win32\u pnpsignedriver项:

var mgmentsearcher = "SELECT * FROM Win32_PnPSignedDriver WHERE DeviceID like '%" + searchKey.Replace("\\", "\\\\") + "%'";            ManagementObjectCollection collection;

using (var searcher = new ManagementObjectSearcher(mgmentsearcher))
collection = searcher.Get();

foreach (var device in collection)
{
    var properties = device.Properties;

    var propertyEnumerator = properties.GetEnumerator();

    while (propertyEnumerator.MoveNext())
    {
        var p = (PropertyData)propertyEnumerator.Current;
        Console.WriteLine("Property {0}, Value: {1}", p.Name, p.Value);
    }
}

collection.Dispose();
首先,从设备详细信息中获取设备Id:

var device = _xAudio2Instances[TchDevice.Core].GetDeviceDetails(i);
classId = device.DeviceId.Replace("{0.0.0.00000000}.", "");
一旦您有了id,我们就可以在以下位置获取此项的注册表项: 软件\Microsoft\Windows\CurrentVersion\MMDevices\Audio\Render\classId\Properties

RegistryKey localKey = RegistryKey.OpenBaseKey(Microsoft.Win32.RegistryHive.LocalMachine,RegistryView.Registry64);

Microsoft.Win32.RegistryKey key = localKey.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\MMDevices\\Audio\\Render\\" + classId + "\\Properties");

var searchKey = key.GetValue("{b3f8fa53-0004-438e-9003-51a46e139bfc},2").ToString().Split('.')[1];
获得searchKey后,您就可以获得Win32\u PnPSignedDriver条目:

var mgmentsearcher = "SELECT * FROM Win32_PnPSignedDriver WHERE DeviceID like '%" + searchKey.Replace("\\", "\\\\") + "%'";            ManagementObjectCollection collection;

using (var searcher = new ManagementObjectSearcher(mgmentsearcher))
collection = searcher.Get();

foreach (var device in collection)
{
    var properties = device.Properties;

    var propertyEnumerator = properties.GetEnumerator();

    while (propertyEnumerator.MoveNext())
    {
        var p = (PropertyData)propertyEnumerator.Current;
        Console.WriteLine("Property {0}, Value: {1}", p.Name, p.Value);
    }
}

collection.Dispose();