807
社区成员
发帖
与我相关
我的任务
分享
对于楼顶文字,我严重怀疑你是会打中文的老外,因为我看了三遍,完全没看明白你在讲什么,虽然字都认识.....
看了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
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 Long
Private 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 Long
Private Preview_Handle As Long
Public 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 Function
Public 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 Long
Private 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 Sub
Private Sub Form_Load()
Video_Handle = CreateCaptureWindow(PicCapture.hwnd)
nowPic.Visible = False
End Sub
Private Sub Form_Unload(Cancel As Integer)
Disconnect Video_Handle
End Sub