C#如何获取声音输入的名称
Posted
技术标签:
【中文标题】C#如何获取声音输入的名称【英文标题】:C# How to get names of sound input 【发布时间】:2015-04-30 12:04:34 【问题描述】:我想使用此代码获得用户友好的声音输入名称,但它只能给我名称的前 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;
我需要这些声音输入的名称:
但是这段代码只给了我这个:
谢谢你们!
【问题讨论】:
您是否尝试更改64
in [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 64)]
?
@DrKoch 根据该数据结构的规范,它应该是 32,我认为他尝试将其更改为 64 以查看是否会获得更多数据,但不幸的是它可能会破坏结构的其余部分,他只是没有看到它,因为他没有使用其余部分。
困扰我的是你使用的是TStr
,这不是一个广泛的功能。
【参考方案1】:
您可能必须使用管理界面:
ManagementObjectSearcher objSearcher = new ManagementObjectSearcher(
"SELECT * FROM Win32_SoundDevice");
ManagementObjectCollection objCollection = objSearcher.Get();
foreach (ManagementObject obj in objCollection)
foreach (PropertyData property in obj.Properties)
Console.Out.WriteLine(String.Format("0:1", property.Name, property.Value));
来源:How to enumerate audio out devices in c#
【讨论】:
【参考方案2】:您可以使用WASAPI 获取声音设备的全名。唯一的限制是它在 Windows XP 或更旧的操作系统中不可用。 您需要使用IMMDeviceEnumerator::EnumAudioEndpoints 方法来实现目标,但由于库是COM,您需要将其包装以便能够在C# 中使用它。 CodeProject 上提供了一个示例项目。
我也找不到使用 WinMM 库获取全名的方法,最后围绕 WASAPI 编写了一个 C++ wrapper,并通过 pinvoke 在 C# 中使用了该包装器!
【讨论】:
以上是关于C#如何获取声音输入的名称的主要内容,如果未能解决你的问题,请参考以下文章
如何在 ASP.NET (C#) 中获取 DateRangePicker 控件值