2010-11-26 33 views
6

シンプルなC++のWin32コンソールアプリです。私たちが望むのは、使用可能なWebカメラやその他のビデオキャプチャデバイスのリストを印刷することだけです。私たちは可能な限りwindows apisを使いたいと思っています。外部libはありません。結局のところ、私たちが望むのは、リストを印刷することです。月に飛ぶのではなく!)そのようにするには?Windows上でビデオキャプチャデバイス(Webカメラ)のリストを取得するにはどうすればよいですか? (C++)

私自身・リサーチ: 私はこのofficial msdn sampleが見つかりましたが、私はまだどのように画面=((すみませんへの出力デバイスのリストをするために取得していない - 私はC++に新しいです)

...もう少し・リサーチ...トピックに関する最も単純ミリ秒サンプルの一つで

それが仕事をする必要がありますが、私はそうデータを出力する単純なコマンドラインアプリにこれを含める方法を取得しないように

HRESULT OnInitDialog(HWND hwnd, ChooseDeviceParam *pParam) 
{ 
    HRESULT hr = S_OK; 

    HWND hList = GetDlgItem(hwnd, IDC_DEVICE_LIST); 

    // Display a list of the devices. 

    for (DWORD i = 0; i < pParam->count; i++) 
    { 
     WCHAR *szFriendlyName = NULL; 

     hr = pParam->ppDevices[i]->GetAllocatedString(
      MF_DEVSOURCE_ATTRIBUTE_FRIENDLY_NAME, 
      &szFriendlyName, 
      NULL 
      ); 

     if (FAILED(hr)) 
     { 
      break; 
     } 

     int index = ListBox_AddString(hList, szFriendlyName); 

     ListBox_SetItemData(hList, index, i); 

     CoTaskMemFree(szFriendlyName); 
    } 

が見えるこれを見つけた...

このシリーズからも

:正しいと

答えて

7

表示されている例から、次のコードをdev.cにコピーします。次に、すべてのSDK変数を設定してコマンドラインを開きます。コマンドラインでole32.libとoleaut32.libにリンクします。その後、すべてのデバイスが表示されます。

CL dev.c ole32.lib oleaut32.lib

dev.exeは、コマンドライン上のリストを提供します。

#include <windows.h> 
#include <dshow.h> 

#pragma comment(lib, "strmiids") 

HRESULT EnumerateDevices(REFGUID category, IEnumMoniker **ppEnum) 
{ 
    // Create the System Device Enumerator. 
    ICreateDevEnum *pDevEnum; 
    HRESULT hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL, 
     CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&pDevEnum)); 

    if (SUCCEEDED(hr)) 
    { 
     // Create an enumerator for the category. 
     hr = pDevEnum->CreateClassEnumerator(category, ppEnum, 0); 
     if (hr == S_FALSE) 
     { 
      hr = VFW_E_NOT_FOUND; // The category is empty. Treat as an error. 
     } 
     pDevEnum->Release(); 
    } 
    return hr; 
} 


void DisplayDeviceInformation(IEnumMoniker *pEnum) 
{ 
    IMoniker *pMoniker = NULL; 

    while (pEnum->Next(1, &pMoniker, NULL) == S_OK) 
    { 
     IPropertyBag *pPropBag; 
     HRESULT hr = pMoniker->BindToStorage(0, 0, IID_PPV_ARGS(&pPropBag)); 
     if (FAILED(hr)) 
     { 
      pMoniker->Release(); 
      continue; 
     } 

     VARIANT var; 
     VariantInit(&var); 

     // Get description or friendly name. 
     hr = pPropBag->Read(L"Description", &var, 0); 
     if (FAILED(hr)) 
     { 
      hr = pPropBag->Read(L"FriendlyName", &var, 0); 
     } 
     if (SUCCEEDED(hr)) 
     { 
      printf("%S\n", var.bstrVal); 
      VariantClear(&var); 
     } 

     hr = pPropBag->Write(L"FriendlyName", &var); 

     // WaveInID applies only to audio capture devices. 
     hr = pPropBag->Read(L"WaveInID", &var, 0); 
     if (SUCCEEDED(hr)) 
     { 
      printf("WaveIn ID: %d\n", var.lVal); 
      VariantClear(&var); 
     } 

     hr = pPropBag->Read(L"DevicePath", &var, 0); 
     if (SUCCEEDED(hr)) 
     { 
      // The device path is not intended for display. 
      printf("Device path: %S\n", var.bstrVal); 
      VariantClear(&var); 
     } 

     pPropBag->Release(); 
     pMoniker->Release(); 
    } 
} 

void main() 
{ 
    HRESULT hr = CoInitializeEx(NULL, COINIT_MULTITHREADED); 
    if (SUCCEEDED(hr)) 
    { 
     IEnumMoniker *pEnum; 

     hr = EnumerateDevices(CLSID_VideoInputDeviceCategory, &pEnum); 
     if (SUCCEEDED(hr)) 
     { 
      DisplayDeviceInformation(pEnum); 
      pEnum->Release(); 
     } 
     hr = EnumerateDevices(CLSID_AudioInputDeviceCategory, &pEnum); 
     if (SUCCEEDED(hr)) 
     { 
      DisplayDeviceInformation(pEnum); 
      pEnum->Release(); 
     } 
     CoUninitialize(); 
    } 
} 
+0

grate work! +1! – Rella

1
+0

win32は直接使用しません。私はライブラリが必要ない - すべて私は簡単なリストが必要です!おそらく1つのリクエストと同じくらい簡単なものです... – Rella

+1

DirectShow/vfwを使用する必要があると思います。カメラを管理しているからです。私はwin32のDirectShowカメラにアクセスすることはできません。 –

4

合理的にコードの10行の周りのどこかにあったかもしれない何これというMicrosoftは、COMの素晴らしさのおかげで、a couple hundred linesまたはようになってしまいます。

関連する問題