• 查找摄像头


    // 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(); }

  • 相关阅读:
    18. 4Sum(双指针)
    17. Letter Combinations of a Phone Number(bfs)
    16. 3Sum Closest(双指针)
    15. 3Sum(字典) (双指针)
    14. Longest Common Prefix(暴力循环)
    8. String to Integer (atoi)
    54. Spiral Matrix(剑指offer--19)
    Baidu 推荐技术平台(offer)
    134. Gas Station(数学定理依赖题)
    187. Repeated DNA Sequences(建立词典,遍历一遍 o(n))
  • 原文地址:https://www.cnblogs.com/dengpeng1004/p/4112647.html
Copyright © 2020-2023  润新知