2013-04-12 7 views
0

Как я могу получить все доступные драйверы веб-камеры на компьютере? Я хочу показать драйверы в поле со списком.Как получить список установленных веб-камер?

+2

И ответ, вероятно, "с запросом WMI." У нас есть эксперт по WMI и Delphi, который довольно активен; если он появится, он, вероятно, даст вам хороший ответ. –

+1

Вы хотите, чтобы «установленные веб-камеры» (которые являются ** устройствами **) или «доступными драйверами веб-камеры» (которые являются ** драйверами **)? Это не одно и то же, и как получить каждый из них резко отличается. –

+0

@ken Я был смущен тем же, поэтому я проголосовал за закрытие ... Хороший вопрос, если бы это было достаточно ясно ... –

ответ

7

Чтобы перечислить веб-камеры, вы можете использовать System Device Enumerator, передавая CLSID_VideoInputDeviceCategory GUID, который получит все устройства захвата видео.

Попробуйте этот образец

{$APPTYPE CONSOLE} 

uses 
    SysUtils, 
    Windows, 
    ActiveX, 
    DirectShow9, 
    ComObj; 

procedure EnumerateVideoInputDevices; 
const 
    IID_IPropertyBag   : TGUID = '{55272A00-42CB-11CE-8135-00AA004BB851}'; 
var 
    LDevEnum : ICreateDevEnum; 
    ppEnumMoniker : IEnumMoniker; 
    pceltFetched : ULONG; 
    Moniker : IMoniker; 
    PropBag : IPropertyBag; 
    pvar  : olevariant; 
    hr   : HRESULT; 
    i   : integer; 
begin 
    CocreateInstance(CLSID_SystemDeviceEnum, nil, CLSCTX_INPROC, IID_ICreateDevEnum, LDevEnum); 
    hr := LDevEnum.CreateClassEnumerator(CLSID_VideoInputDeviceCategory, ppEnumMoniker, 0); 
    if (hr = S_OK) then 
    begin 
    while(ppEnumMoniker.Next(1, Moniker, @pceltFetched) = S_OK) do 
     begin 
     Moniker.BindToStorage(nil, nil, IID_IPropertyBag, PropBag); 
     if PropBag.Read('Description', pvar, nil) = S_OK then 
      Writeln(Format('Description %s',[String(pvar)])); 
     if PropBag.Read('FriendlyName', pvar, nil) = S_OK then 
      Writeln(Format('Friendly Name %s',[String(pvar)])); 
     if PropBag.Read('DevicePath', pvar, nil) = S_OK then 
      Writeln(Format('Device Path %s',[String(pvar)])); 
     if PropBag.Read('CLSID', pvar, nil) = S_OK then 
      Writeln(Format('CLSID   %s',[String(pvar)])); 
     PropBag := nil; 
     Moniker := nil; 
     end; 
    end; 
    ppEnumMoniker :=nil; 
    LDevEnum :=nil; 
end; 



begin 
try 
    CoInitialize(nil); 
    try 
     EnumerateVideoInputDevices; 
    finally 
     CoUninitialize; 
    end; 
except 
    on E:EOleException do 
     Writeln(Format('EOleException %s %x', [E.Message,E.ErrorCode])); 
    on E:Exception do 
     Writeln(E.Classname, ':', E.Message); 
end; 
Writeln('Press Enter to exit'); 
Readln; 
end. 
+0

Недостаточно WMI ;-) – OnTheFly

Смежные вопросы