C#如何获取声音输入的名称

时间:2015-04-30 12:04:34

标签: c# wpf windows audio input

我希望使用此代码获得用户友好的声音输入名称,但它只能给我前32个字符的名字,但我想要它完整。

[DllImport("winmm.dll", SetLastError = true)]
static extern uint waveInGetNumDevs();

[DllImport("winmm.dll", SetLastError = true, CharSet = CharSet.Auto)]
public static extern uint waveInGetDevCaps(uint hwo, ref WAVEOUTCAPS pwoc, uint cbwoc);

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
public struct WAVEOUTCAPS
{
    public ushort wMid;
    public ushort wPid;
    public uint vDriverVersion;
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 64)]
    public string szPname;
    public uint dwFormats;
    public ushort wChannels;
    public ushort wReserved1;
    public uint dwSupport;
}

public static string[] GetSoundDevices()
{
    uint devices = waveInGetNumDevs();
    string[] result = new string[devices];
    WAVEOUTCAPS caps = new WAVEOUTCAPS();
    using (StreamWriter sw = new StreamWriter("appdata/audio/name"))
    {
        for (uint i = 0; i < devices; i++)
        {
            waveInGetDevCaps(i, ref caps, (uint)Marshal.SizeOf(caps));
            result[i] = caps.szPname;
            sw.WriteLine(caps.szPname);
        }
        return result;
    }
}

我需要声音输入的名称: enter image description here

但是这段代码只给我这个:

enter image description here

谢谢你们!

2 个答案:

答案 0 :(得分:0)

您可能必须使用管理界面:

;

来源:How to enumerate audio out devices in c#

答案 1 :(得分:0)

您可以使用WASAPI获取声音设备的全名。唯一的限制是它在Windows XP或旧版操作系统中不可用。 您需要使用IMMDeviceEnumerator::EnumAudioEndpoints方法来实现目标,但由于库是COM,您需要将其包装起来以便能够在C#中使用它。 CodeProject上提供了一个示例项目。

我也找不到使用WinMM库获取全名的方法,最后在WASAPI周围编写C++ wrapper并通过pinvoke在C#中使用该包装器!