【问题标题】:How to detect if a Microphone is present如何检测麦克风是否存在
【发布时间】:2011-01-14 23:04:21
【问题描述】:

我刚刚打了一个很长的技术支持电话,因为一位客户的笔记本电脑上没有麦克风。 (愚蠢的我:他们说他们之前使用过麦克风,而我从未听说过笔记本电脑没有有麦克风)。

我想知道是否有办法检测 Windows XP、Vista、7 上是否有麦克风(录音功能)。

(我启用了错误处理,它会记录错误,然后退出函数,但如果没有麦克风,应用程序只会在 Windows 7 上崩溃。)

【问题讨论】:

标签: vb6 windows-7 windows-vista windows-xp microphone


【解决方案1】:

我会使用IMMDeviceEnumerator::GetDefaultAudioEndpoint - 这将返回指定角色和数据流的默认音频设备。

特别是,你会使用:

    CComPtr<IMMDeviceEnumerator> pEnumerator;
    CComPtr<IMMDevice> pDevice;

    hr = CoCreateInstance(__uuidof(MMDeviceEnumerator), NULL,
           CLSCTX_ALL, IID_PPV_ARGS(&pEnumerator));
    if (SUCCEEDED(hr))
    {
        hr = pEnumerator->GetDefaultAudioEndpoint(eCapture, eConsole, &pDevice);
    }
    if (!pDevice || hr == ERROR_NOT_FOUND)
    {
           // no microphone
    }

【讨论】:

    【解决方案2】:

    查看System Tray Audio Device Switcher

    VB source code 中,您将举例说明如何枚举音频 I/O 设备。

    【讨论】:

      【解决方案3】:

      在 C++ 中

      #include "stdafx.h"
      #include "Mmdeviceapi.h"
      #include <atlbase.h>
      
      
      int _tmain(int argc, _TCHAR* argv[])
      {
          CoInitializeEx(NULL, COINIT_MULTITHREADED);
      
          CComPtr<IMMDeviceEnumerator> pEnumerator = NULL;
          CComPtr<IMMDevice> pDevice;
          const CLSID CLSID_MMDeviceEnumerator = __uuidof(MMDeviceEnumerator);
          const IID IID_IMMDeviceEnumerator = __uuidof(IMMDeviceEnumerator);
          HRESULT hr = CoCreateInstance(
              CLSID_MMDeviceEnumerator, NULL,
              CLSCTX_ALL, IID_IMMDeviceEnumerator,
              (void**)&pEnumerator);
      
          if (FAILED(hr))
          {
              printf("failed");
          }
          else
          {
              hr = pEnumerator->GetDefaultAudioEndpoint(eCapture, eConsole, &pDevice);
      
              if (!pDevice || hr == ERROR_NOT_FOUND)
              {
                  printf("no microphone");
              }
              else
              {
                  printf("microphone present");
              }
      
          }
      
          return 0;
      }
      

      【讨论】:

        【解决方案4】:

        我认为您在 VB 6 中能够做到这一点的唯一方法是通过 Direct X:

        http://msdn.microsoft.com/en-us/library/bb318770(VS.85).aspx

        你可以看看这个:

        http://msdn.microsoft.com/en-us/library/bb280815(VS.85).aspx

        CaptureDevices 集合类 (Microsoft.DirectX.DirectSound)

        http://msdn.microsoft.com/en-us/library/ms810619.aspx

        您也可以调用 dxdiag..

        【讨论】:

        • 我没有对此进行测试,但它看起来是最好的答案(对于 VB6)。
        • @ClayNichols 你测试了吗?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多