我用VB6,在窗体里加了一个PictureBox或者Image,用来表示摄像头显示所拍摄的区域,现在加了一个按钮,拍照让拍下来的照片显示在这个PictureBox框里,我网上找了找,一旦拍摄启动,感觉是调用资源的问题,请有做过的大牛赐教!

解决方案 »

  1.   

    我用了网上一段程序,如下:
    .bas部分的代码
    Private Declare Function capCreateCaptureWindow Lib "avicap32.dll" _
      Alias "capCreateCaptureWindowA" ( _
      ByVal lpszWindowName As String, _
      ByVal dwStyle As Long, _
      ByVal x As Long, _
      ByVal y As Long, _
      ByVal nWidth As Long, _
      ByVal nHeight As Long, _
      ByVal hWndParent As Long, _
      ByVal nID As Long) As LongPrivate Const WS_CHILD = &H40000000
    Private Const WS_VISIBLE = &H10000000
    Private Const WM_USER = &H400
    Private Const WM_CAP_START = &H400
    Private Const WM_CAP_EDIT_COPY = (WM_CAP_START + 30)
    Private Const WM_CAP_DRIVER_CONNECT = (WM_CAP_START + 10)
    Private Const WM_CAP_SET_PREVIEWRATE = (WM_CAP_START + 52)
    Private Const WM_CAP_SET_OVERLAY = (WM_CAP_START + 51)
    Private Const WM_CAP_SET_PREVIEW = (WM_CAP_START + 50)
    Private Const WM_CAP_DRIVER_DISCONNECT = (WM_CAP_START + 11)Private Declare Function SendMessage Lib "user32" _
      Alias "SendMessageA" ( _
      ByVal hwnd As Long, _
      ByVal wMsg As Long, _
      ByVal wParam As Long, _
      lParam As Any) As LongPrivate Preview_Handle As LongPublic Function CreateCaptureWindow( _
      hWndParent As Long, _
      Optional x As Long = 0, _
      Optional y As Long = 0, _
      Optional nWidth As Long = 440, _
      Optional nHeight As Long = 440, _
      Optional nCameraID As Long = 0) As Long  Preview_Handle = capCreateCaptureWindow("Video", _
        WS_CHILD + WS_VISIBLE, x, y, _
        nWidth, nHeight, hWndParent, 1)  SendMessage Preview_Handle, WM_CAP_DRIVER_CONNECT, nCameraID, 0
      SendMessage Preview_Handle, WM_CAP_SET_PREVIEWRATE, 30, 0
      SendMessage Preview_Handle, WM_CAP_SET_OVERLAY, 1, 0
      SendMessage Preview_Handle, WM_CAP_SET_PREVIEW, 1, 0  CreateCaptureWindow = Preview_Handle
    End FunctionPublic Function CapturePicture(nCaptureHandle As Long) As StdPicture
      Clipboard.Clear
      SendMessage nCaptureHandle, WM_CAP_EDIT_COPY, 0, 0
      Set CapturePicture = Clipboard.GetData
    End Function
    Public Sub Disconnect(nCaptureHandle As Long, _
      Optional nCameraID = 0)  SendMessage nCaptureHandle, WM_CAP_DRIVER_DISCONNECT, _
        nCameraID, 0
    End Sub放了一个窗体,一个按钮,一个picturebox控件,窗体部分代码:
    Dim Video_Handle As LongPrivate Sub Command1_Click()
      Dim x As StdPicture
        Set x = CapturePicture(Video_Handle)
        SavePicture x, "c:\a1.bmp"
        PicCapture.Visible = False
        nowPic.Visible = True
        nowPic.Picture = LoadPicture("c:\a1.bmp")
        Image1.Picture = LoadPicture("c:\a1.bmp")
    End SubPrivate Sub Form_Load()
       Video_Handle = CreateCaptureWindow(PicCapture.hwnd)
       nowPic.Visible = False
    End SubPrivate Sub Form_Unload(Cancel As Integer)
      Disconnect Video_Handle
    End Sub
    执行到这两句出错:
       Set x = CapturePicture(Video_Handle)
        SavePicture x, "c:\a1.bmp"
    提示的错误是:
     runtime error "521 " can't open clipboard
    不知道什么原因?
      

  2.   

    对于楼顶文字,我严重怀疑你是会打中文的老外,因为我看了三遍,完全没看明白你在讲什么,虽然字都认识.....看了3楼补充,终于让我明白了:
    原来你是因为这部分代码有错误好吧,扯远了,中文语法问题我没法帮你,但VB的问题还是能帮到点的:你的错误是"runtime error "521 " can't open clipboard",已经讲得很明白,无法打开剪贴板.从CapturePicture()函数的实现来看,需要把截的图放到剪贴板里再取回来,才能得到一个stdPicture对象,以便保存.Public Function CapturePicture(nCaptureHandle As Long) As StdPicture
      Clipboard.Clear
      SendMessage nCaptureHandle, WM_CAP_EDIT_COPY, 0, 0
      Set CapturePicture = Clipboard.GetData
    End Function至于你这代码为什么无法打开剪贴板,你要跟到CapturePicture()内部去,搞清楚具体错误是在哪一行.如果是Clipboard.Clear,那有可能是别的程序正在使用,可以尝试用一个带Sleep(100)的循环去调用这一句,没有错误的话即成功.另外,这样的方法不好,因为你并不需要使用到剪贴板,WM_CAP_EDIT_COPY消息是方便在别的地方(例如QQ聊天窗口中)粘贴图像而使用的,你这里是为了保存到文件并显示,那使用WM_CAP_FILE_SAVEDIB消息是最合适不过的了.这里给你一个封装:Function capFileSaveDIB(ByVal hCapWnd As Long, ByVal FilePath As String) As Boolean
       capFileSaveDIB = SendMessageAsString(hCapWnd, WM_CAP_FILE_SAVEDIB, 0&, FilePath)
    End Function'调用:
    if not capFileSaveDIB(Video_Handle,"C:\a1.bmp") then
        Msgbox "保存失败!"
    end if
      

  3.   

    在获取视频的时候和获取别的窗体的时候用的API是不一样的,以前我测试过用普能API不能截取播放的影片的图,后来没再试过。
    用暴风和QQ可以实现。暂没发现是什么原理。