الحصول على اسم الجهاز الصوتي الكامل من ويندوز

StackOverflow https://stackoverflow.com/questions/1429143

  •  07-07-2019
  •  | 
  •  

سؤال

هل هناك طريقة للحصول على على الاسم جهاز كامل الصوت في نظام التشغيل Windows XP وفي وقت لاحق؟

ويمكنني استخدام MIXERCAPS لكن عضو szPname الحد إلى 32 حرفا (بما في ذلك NULL). للحصول على اسم جهاز الصوت من "ميكروفون (الصوت عالي الوضوح الجهاز)"، أنا فقط نعود "ميكروفون (عالية الوضوح العود". ومن المقرر أن يجري تحديد MAXPNAMELEN إلى 32. هذا وقد حاولت إعادة تعريف لعدد أكبر من أي تأثير .

وهنا هو رمز أنا باستخدام:

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

هذا السؤال ، ولكنه يحيل فيستا وفي وقت لاحق.

هل كانت مفيدة؟

المحلول

إذا كنت تستخدم الكلاسيكية واجهة ويندوز الوسائط المتعددة وربما كنت لا تستطيع الحصول على حول الحد MAXPNAMELEN، لأن ذلك هو تجميعها في ويندوز نفسه.

ولكن هل يمكن أن يكون قادرا على الحصول على اسم الجهاز الكامل إذا كنت تستخدم دايركت بدلا من ذلك. التعليمة البرمجية التالية لم تختبر ولكن أعتقد أنه يجب أن تعمل.

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

نصائح أخرى

هل يمكن أن حاول استخدام المساعدة DevCon. متوفر في موقع مايكروسوفت هنا .

وأعتقد المساعدة DevCon listclass وسائل الإعلام قد تعطيك النتيجة التي كنت تبحث عنها.

وفيما يلي قانون بلدي (دلفي):

وهذا هو باستخدام DirectShow / اكتف، ومن enumurates الأجهزة دايركت، والتي تشمل أجهزة WaveOut ملفوفة كذلك.

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;
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top