Dim capHwnd As LongPrivate Sub Command1_Click()
    Dim lRet As Long
    Picture1.AutoRedraw = True
    capHwnd = capCreateCaptureWindowA("", ws_visible Or ws_child, 0, 0, 320, 240, Picture1.hWnd, 0)
    lRet = SendMessage(capHwnd, WM_CAP_DRIVER_CONNECT, 0, 0)
    SendMessage capHwnd, WM_CAP_SET_SCALE, True, 0
    SendMessage capHwnd, WM_CAP_SET_PREVIEWRATE, 30, 0
    'SendMessage capHwnd, WM_CAP_SET_PREVIEW, True, 0
    lRet = SendMessage(capHwnd, WM_CAP_DRIVER_CONNECT, 0, 0)
End Sub在用以上代码捕获摄像头时遇到了两个问题:
1、如果有别的程序在使用摄像头,执行到SendMessage capHwnd, WM_CAP_DRIVER_CONNECT, 0, 0时会弹出选择设备的窗口,如何事先检测摄像头是否正在使用而避免弹出该窗口?
2、有时候捕获到的是黑屏,应该如何解决?

解决方案 »

  1.   

    1。在CAPDRIVERCAPS结构中,有fCaptureInitialized这个标志,表示设备是否可用,你可以用capDriverGetCaps得到设备信息,如果fCaptureInitialized=0,就说明设备被占用或无效。
    2。黑屏说明没有捕捉到数据,是不是设备连接问题?
      

  2.   

    那么如何得到一个CAPDRIVERCAPS结构呢?capDriverGetCaps好像不是一个avicap32.dll中的标准函数啊?
      

  3.   

    不行啊,不管摄像头有没有被使用,fCaptureInitialized都是0啊,CAPSTATUS结构中fCapturingNow也总是0,还有别的办法吗?
      

  4.   

    怎么我返回的是1?
    capDriverGetCaps是一个宏,它是这样的:
     SendMessage(lwnd, WM_CAP_DRIVER_GET_CAPS, wSize, s)
      

  5.   

    这个宏我倒是搞明白了,但是为什么fCaptureInitialized总是0啊?
      

  6.   

    fCaptureInitialized=0是因为capDriverConnect(lwndC, 0)摄像头连接失败
    看看你的代码怎么有两行lRet = SendMessage(capHwnd, WM_CAP_DRIVER_CONNECT, 0, 0)
    呀!!把后面那行删除,因为前面已连接了一次,后面再连肯定出错!检测一下lRet是否为true
      

  7.   

    我已经注意到了,而且已经改过来了,应该是lRet = SendMessage(capHwnd, WM_CAP_DRIVER_DISCONNECT, 0, 0),这样也是不行,不知道怎么回事。
      

  8.   

    Dim lRet As Long
        Picture1.AutoRedraw = True
        capHwnd = capCreateCaptureWindowA("", ws_visible Or ws_child, 0, 0, 320, 240,        Picture1.hWnd, 0)
        lRet = SendMessage(capHwnd, WM_CAP_DRIVER_CONNECT, 0, 0)
        if lRet then
           SendMessage capHwnd, WM_CAP_SET_SCALE, True, 0
           SendMessage capHwnd, WM_CAP_SET_PREVIEWRATE, 30, 0
           SendMessage capHwnd, WM_CAP_SET_PREVIEW, True, 0
        else
           msgbox "没有安装摄像头或正在使用!"
        end if
      

  9.   

    问题是当执行到lRet = SendMessage(capHwnd, WM_CAP_DRIVER_CONNECT, 0, 0)这句时,如果此时摄像头正在使用,就会弹出来一个窗口,关闭这个窗口后你的代码才能判断出"没有安装摄像头或正在使用!",而我需要解决的就是怎么避免弹出这个窗口
      

  10.   

    这样啊~~~ 
    这么说要避免弹出这个窗口,就只好不使用SendMessage(capHwnd, WM_CAP_DRIVER_CONNECT, 0, 0)了?
    实在找不到其他函数可以判断摄像头正在使用了~~~试试SendMessage(lwnd, WM_CAP_SET_CALLBACK_FRAME, 0, lpProc)  lpProc是回调函数地址
    当SendMessage(capHwnd, WM_CAP_DRIVER_CONNECT, 0, 0)发生错误时应该先调用这个回调函数吧
      

  11.   

    我这有个VB调用摄像头的程序,里面有回调函数的写法。把你的邮箱告诉我,我发给你应该是SendMessage(lwnd, WM_CAP_SET_CALLBACK_ERROR, 0, lpProc),你也可以到msdn上查啊