2009-09-15 4 views
5

Gibt es eine Möglichkeit, den vollen Audiogerät-Namen in Windows XP und höher zu erhalten?Erhalten Sie den vollständigen Audio-Gerätenamen von Windows

Ich kann MIXERCAPS verwenden, aber das szPname-Mitglied wird auf 32 Zeichen (einschließlich NULL) beschränkt. Für einen Audiogerätnamen von "Mikrofon (High Definition Audio Device)" bekomme ich nur "Mikrofon (High Definition Aud") zurück. Dies liegt daran, dass MAXPNAMELEN auf 32 definiert ist. Ich habe versucht, es zu einer größeren Zahl ohne Wirkung neu zu definieren .

Hier ist der Code ich verwende:

MIXERCAPS mc; 
ZeroMemory(&mc, sizeof(MIXERCAPS)); 
mm = mixerGetDevCaps(reinterpret_cast<UINT_PTR>(m_hMixer), &mc, sizeof(MIXERCAPS)); 

ich this question sah, aber es Vista verweist und später

+0

Entschuldigung, aber, was progarming Sprache ist diese Frage? –

Antwort

1

Wenn Sie die klassische Windows Multimedia-Schnittstelle verwenden, können Sie die MAXPNAMELEN-Einschränkung wahrscheinlich nicht umgehen, da diese in Windows selbst kompiliert wird.

Sie können jedoch möglicherweise den vollständigen Gerätenamen abrufen, wenn Sie stattdessen DirectSound verwenden. Der folgende Code ist nicht getestet, aber ich denke, es sollte funktionieren.

BOOL CALLBACK EnumCallback(LPGUID guid, LPCSTR descr, LPCSTR modname, LPVOID ctx) 
{ 
    std::vector<std::string> *names = (std::vector<std::string>*)ctx; 
    names->push_back(std::string(descr)); 
    return TRUE; 
} 

int main() 
{ 
    std::vector<std::string> names; 
    if (!FAILED(DirectSoundEnumerate(&EnumCallback, &names))) 
    { 
     // do stuff 
    } 
} 
0

Sie mit devcon versuchen könnte here auf Microsofts Website verfügbar

...

Ich glaube, devcon listclass media kann Ihnen das Ergebnis liefern, nach dem Sie suchen.

+0

oder versuchen Sie: devcon listclass AudioEndpoint –

0

Unten ist mein (Delphi) Code:

Diese Directshow/ActiveX verwendet, Es enumurates DirectSound- Geräte, die auch WaveOut Geräte gewickelt umfassen.

procedure EnumAudioDevices; 
var 
    dsCreateDevEnum : ICreateDevEnum; 
    EnumDevice  : IEnumMoniker; 
    DeviceMoniker : IMoniker; 
    Data    : Integer; 
    DevicePropBag : IPropertyBag; 
    DeviceName  : OLEVariant; 
    I    : Integer; 
begin 
    // CLSID_CQzFilterClassManager = Entire DirectShow Filter List 
    If CoCreateInstance(CLSID_SystemDeviceEnum,nil,CLSCTX_INPROC_SERVER,IID_ICreateDevEnum,dsCreateDevEnum) = S_OK then 
    Begin 
    If dsCreateDevEnum.CreateClassEnumerator(CLSID_AudioRendererCategory,EnumDevice,0) = S_OK then 
    Begin 
     I := 0; 
     EnumDevice.Reset; 
     While EnumDevice.Next(1,DeviceMoniker,@Data) = S_OK do 
     Begin 
     If DeviceMoniker.BindToStorage(nil,nil,IID_IPropertyBag,DevicePropBag) = NOERROR then 
     Begin 
      If DevicePropBag.Read('FriendlyName',DeviceName,nil) = NOERROR then 
      Begin 
      // Success 
      ShowMessage(DeviceName); 
      Inc(I); 
      End; 
      DevicePropBag := nil; 
     End; 
     DeviceMoniker := nil; 
     End; 
     EnumDevice := nil; 
    End; 
    dsCreateDevEnum := nil; 
    End; 
End; 
Verwandte Themen