查找摄像头

// 2_CAMDlg.cpp : 实现文件 //

#include "stdafx.h" #include "2_CAM.h" #include "2_CAMDlg.h" #include "afxdialogex.h"

#pragma comment(lib,"Strmiids") #pragma comment(lib,"quartz") #include <DShow.h>

#ifdef _DEBUG #define new DEBUG_NEW #endif

// 用于应用程序“关于”菜单项的 CAboutDlg 对话框

class CAboutDlg : public CDialogEx { public:  CAboutDlg();

// 对话框数据  enum { IDD = IDD_ABOUTBOX };

 protected:  virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持

// 实现 protected:  DECLARE_MESSAGE_MAP() };

CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD) { }

void CAboutDlg::DoDataExchange(CDataExchange* pDX) {  CDialogEx::DoDataExchange(pDX); }

BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx) END_MESSAGE_MAP()

// CMy2_CAMDlg 对话框

CMy2_CAMDlg::CMy2_CAMDlg(CWnd* pParent /*=NULL*/)  : CDialogEx(CMy2_CAMDlg::IDD, pParent) {  m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); }

void CMy2_CAMDlg::DoDataExchange(CDataExchange* pDX) {  CDialogEx::DoDataExchange(pDX); }

BEGIN_MESSAGE_MAP(CMy2_CAMDlg, CDialogEx)  ON_WM_SYSCOMMAND()  ON_WM_PAINT()  ON_WM_QUERYDRAGICON()  ON_BN_CLICKED(IDOK, &CMy2_CAMDlg::OnBnClickedOk) END_MESSAGE_MAP()

// CMy2_CAMDlg 消息处理程序

BOOL CMy2_CAMDlg::OnInitDialog() {  CDialogEx::OnInitDialog();

 // 将“关于...”菜单项添加到系统菜单中。

 // IDM_ABOUTBOX 必须在系统命令范围内。  ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);  ASSERT(IDM_ABOUTBOX < 0xF000);

 CMenu* pSysMenu = GetSystemMenu(FALSE);  if (pSysMenu != NULL)  {   BOOL bNameValid;   CString strAboutMenu;   bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);   ASSERT(bNameValid);   if (!strAboutMenu.IsEmpty())   {    pSysMenu->AppendMenu(MF_SEPARATOR);    pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);   }  }

 // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动  //  执行此操作  SetIcon(m_hIcon, TRUE);   // 设置大图标  SetIcon(m_hIcon, FALSE);  // 设置小图标

 // TODO: 在此添加额外的初始化代码

 return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE }

void CMy2_CAMDlg::OnSysCommand(UINT nID, LPARAM lParam) {  if ((nID & 0xFFF0) == IDM_ABOUTBOX)  {   CAboutDlg dlgAbout;   dlgAbout.DoModal();  }  else  {   CDialogEx::OnSysCommand(nID, lParam);  } }

// 如果向对话框添加最小化按钮,则需要下面的代码 //  来绘制该图标。对于使用文档/视图模型的 MFC 应用程序, //  这将由框架自动完成。

void CMy2_CAMDlg::OnPaint() {  if (IsIconic())  {   CPaintDC dc(this); // 用于绘制的设备上下文

  SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

  // 使图标在工作区矩形中居中   int cxIcon = GetSystemMetrics(SM_CXICON);   int cyIcon = GetSystemMetrics(SM_CYICON);   CRect rect;   GetClientRect(&rect);   int x = (rect.Width() - cxIcon + 1) / 2;   int y = (rect.Height() - cyIcon + 1) / 2;

  // 绘制图标   dc.DrawIcon(x, y, m_hIcon);  }  else  {   CDialogEx::OnPaint();  } }

//当用户拖动最小化窗口时系统调用此函数取得光标 //显示。 HCURSOR CMy2_CAMDlg::OnQueryDragIcon() {  return static_cast<HCURSOR>(m_hIcon); }

int CameraCount() {

 int count = 0;  CoInitialize(NULL);

 // enumerate all video capture devices  CComPtr<ICreateDevEnum> pCreateDevEnum;  HRESULT hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER,   IID_ICreateDevEnum, (void**)&pCreateDevEnum);

 CComPtr<IEnumMoniker> pEm;  hr = pCreateDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory,   &pEm, 0);  if (hr != NOERROR)  {   return count;  }

 pEm->Reset();  ULONG cFetched;  IMoniker *pM;  while(hr = pEm->Next(1, &pM, &cFetched), hr==S_OK)  {   count++;  }

 pCreateDevEnum = NULL;  pEm = NULL;  return count; }

int CameraName(int nCamID, char* sName, int nBufferSize) {  int count = 0;  CoInitialize(NULL);

 // enumerate all video capture devices  CComPtr<ICreateDevEnum> pCreateDevEnum;  HRESULT hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER,   IID_ICreateDevEnum, (void**)&pCreateDevEnum);

 CComPtr<IEnumMoniker> pEm;  hr = pCreateDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory,   &pEm, 0);  if (hr != NOERROR) return 0;

 pEm->Reset();  ULONG cFetched;  IMoniker *pM;  while(hr = pEm->Next(1, &pM, &cFetched), hr==S_OK)  {   if (count == nCamID)   {    IPropertyBag *pBag=0;    hr = pM->BindToStorage(0, 0, IID_IPropertyBag, (void **)&pBag);    if(SUCCEEDED(hr))    {     VARIANT var;     var.vt = VT_BSTR;     hr = pBag->Read(L"FriendlyName", &var, NULL); //还有其他属性,像描述信息等等...     if(hr == NOERROR)     {      //获取设备名称         WideCharToMultiByte(CP_ACP,0,var.bstrVal,-1,sName, nBufferSize ,"",NULL);

     SysFreeString(var.bstrVal);         }     pBag->Release();    }    pM->Release();

   break;   }   count++;  }

 pCreateDevEnum = NULL;  pEm = NULL;

 return 1; }

void CMy2_CAMDlg::OnBnClickedOk() {  // TODO: 在此添加控件通知处理程序代码  int iCamCount = CameraCount();

 int CamIdx = 0;  for (int i=0;i<iCamCount;i++)  {   char szCamName[128];   memset(szCamName,0x00,128);   int retval = CameraName(i,szCamName,sizeof(szCamName));   CString temp;   temp.Format(_T("%s"),szCamName);   MessageBox(temp);  } // CDialogEx::OnOK(); }

原文地址:https://www.cnblogs.com/dengpeng1004/p/4112647.html