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;
    

我需要这些声音输入的名称:

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

谢谢你们!

【问题讨论】:

您是否尝试更改64in [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 控件值

如何通过 C# 从 IIS 获取网站名称的端口?

如何从 python 中的麦克风获取声音输入,并即时处理它?

如何在 C# 中获取本地机器名称?

c#中如何获取MYSQL数据库名称、表、列和行

如何使用 C# 在 Autocad 文件中获取标签名称