繁体   English   中英

C#中的捕获设备列表(例如,麦克风,立体声混音...)

[英]List of capture devices (e.g. Microphone, Stereo Mix…) in C#

如何获取可用的声音设备列表? 我的意思是那个形象。

在此处输入图片说明

我想要它在组合框中。 我的意思是:

  • 麦克风
  • 立体声混音
  • 线入
  • ..和更多..

但是必须真的是因为系统会根据语言本地化系统更改设备的名称,这就是我所需要的。

例如,在我的语言中,称为Mikrofon的麦克风和Stereo Mix =Směšovač立体声

在此处输入图片说明

而且我需要得到这些设备的名称

可以制作示例代码吗?

这就是我需要的。

    [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;
        }
    }

..但每一行都缩短了,我无法全部写完。

在此处输入图片说明

如何修改列出整个名称的代码?

谢谢!

用这个对我有用

using NAudio.CoreAudioApi;

MMDeviceEnumerator names = new MMDeviceEnumerator();
var devices = names.EnumerateAudioEndPoints(DataFlow.Capture, DeviceState.Active);            
foreach (var device in devices)
    MessageBox.Show(device.friendlyName);

以下代码可以帮助您获取音频设备列表,

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));
        }
    }

现在,您可以使用for-each枚举列表。

已编辑

输出将是这样的,

Availability:
Caption:USB Audio Device
ConfigManagerErrorCode:0
ConfigManagerUserConfig:False
CreationClassName:Win32_SoundDevice
Description:USB Audio Device
DeviceID:USB\VID_047F&PID_0CA1&MI_00\6&2C037688&0&0000
PNPDeviceID:USB\VID_047F&PID_0CA1&MI_00\6&2C037688&0&0000
PowerManagementCapabilities:
PowerManagementSupported:False
ProductName:USB Audio Device
Status:OK
StatusInfo:3
SystemCreationClassName:Win32_ComputerSystem
SystemName:
Availability:
Caption:Realtek AC'97 Audio for VIA (R) Audio Controller
ConfigManagerErrorCode:0
ConfigManagerUserConfig:False
CreationClassName:Win32_SoundDevice
Description:Realtek AC'97 Audio for VIA (R) Audio Controller
DeviceID:PCI\VEN_1106&DEV_3059&SUBSYS_09011558&REV_60\3&61AAA01&1&8D

从列表中获取标题值。 这是简单的文本解析问题;)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM