Из-за счастливой случайности я, возможно, обнаружил, что да, есть способ обнаружить присутствие подключенного микрофона.
Если ваши «записывающие устройства» Windows показывают «нет микрофона», этот подход (с использованием Microsoft Speech API) будет работать и подтвердит, что у вас нет микрофона. Однако, если Windows считает, что у вас есть микрофон, с этим не будет проблем.
#include <sapi.h>
#include <sapiddk.h>
#include <sphelper.h>
CComPtr<ISpRecognizer> m_cpEngine;
m_cpEngine.CoCreateInstance(CLSID_SpInprocRecognizer);
CComPtr<ISpObjectToken> pAudioToken;
HRESULT hr = SpGetDefaultTokenFromCategoryId(SPCAT_AUDIOIN, &pAudioToken);
if (FAILED(hr)) ::OutputDebugString("no input, aka microphone, detected");
более конкретно, hr вернет этот результат:
SPERR_NOT_FOUND 0x8004503a -2147200966
The requested data item (data key, value, etc.) was not found.