我希望使用此代码获得用户友好的声音输入名称,但它只能给我前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;
}
}
我需要声音输入的名称:
但是这段代码只给我这个:
谢谢你们!
答案 0 :(得分:0)
答案 1 :(得分:0)
您可以使用WASAPI获取声音设备的全名。唯一的限制是它在Windows XP或旧版操作系统中不可用。 您需要使用IMMDeviceEnumerator::EnumAudioEndpoints方法来实现目标,但由于库是COM,您需要将其包装起来以便能够在C#中使用它。 CodeProject上提供了一个示例项目。
我也找不到使用WinMM库获取全名的方法,最后在WASAPI周围编写C++ wrapper并通过pinvoke在C#中使用该包装器!