问题描述
窗体里有一个PictureBox1用来显示摄像头画面和Button1用来拍照现在的问题是程序第一次运行能显示摄像头画面和拍照,第二次运行程序PictureBox1空白,但程序没报错。有没有大大能帮忙说下问题出在哪里,代码里应该怎么改?Form1.vb下的代码ImportsSystem.Runtime.InteropServicesPublicClassForm1ConstWM_CAP_START=&H400SConstWS_CHILD=&H40000000ConstWS_VISIBLE=&H10000000ConstWM_CAP_DRIVER_CONNECT=WM_CAP_START+10ConstWM_CAP_DRIVER_DISCONNECT=WM_CAP_START+11ConstWM_CAP_EDIT_COPY=WM_CAP_START+30ConstWM_CAP_SEQUENCE=WM_CAP_START+62ConstWM_CAP_FILE_SAVEAS=WM_CAP_START+23ConstWM_CAP_SET_SCALE=WM_CAP_START+53ConstWM_CAP_SET_PREVIEWRATE=WM_CAP_START+52ConstWM_CAP_SET_PREVIEW=WM_CAP_START+50ConstSWP_NOMOVE=&H2SConstSWP_NOSIZE=1ConstSWP_NOZORDER=&H4SConstHWND_BOTTOM=1DimhWndAsIntegerDeclareFunctioncapGetDriverDescriptionALib"avicap32.dll"(ByValwDriverIndexAsShort,ByVallpszNameAsString,ByValcbNameAsInteger,ByVallpszVerAsString,ByValcbVerAsInteger)AsBooleanDeclareFunctioncapCreateCaptureWindowALib"avicap32.dll"(ByVallpszWindowNameAsString,ByValdwStyleAsInteger,ByValxAsInteger,ByValyAsInteger,ByValnWidthAsInteger,ByValnHeightAsShort,ByValhWndAsInteger,ByValnIDAsInteger)AsIntegerDeclareFunctionSendMessageLib"user32"Alias"SendMessageA"(ByValhwndAsInteger,ByValMsgAsInteger,ByValwParamAsInteger,<Runtime.InteropServices.MarshalAs(UnmanagedType.AsAny)>ByVallParamAsObject)AsIntegerDeclareFunctionSetWindowPosLib"user32"Alias"SetWindowPos"(ByValhwndAsInteger,ByValhWndInsertAfterAsInteger,ByValxAsInteger,ByValyAsInteger,ByValcxAsInteger,ByValcyAsInteger,ByValwFlagsAsInteger)AsIntegerDeclareFunctionDestroyWindowLib"user32"(ByValhndwAsInteger)AsBooleanPrivateSubPreviewVideo(ByValpbCtrlAsPictureBox)hWnd=capCreateCaptureWindowA(0,WS_VISIBLEOrWS_CHILD,0,0,0,0,pbCtrl.Handle.ToInt32,0)IfSendMessage(hWnd,WM_CAP_DRIVER_CONNECT,0,0)ThenSendMessage(hWnd,WM_CAP_SET_SCALE,True,0)SendMessage(hWnd,WM_CAP_SET_PREVIEWRATE,30,0)SendMessage(hWnd,WM_CAP_SET_PREVIEW,True,0)SetWindowPos(hWnd,HWND_BOTTOM,0,0,pbCtrl.Width,pbCtrl.Height,SWP_NOMOVEOrSWP_NOZORDER)ElseDestroyWindow(hWnd)EndIfEndSubPrivateSubForm1_Load(senderAsSystem.Object,eAsSystem.EventArgs)HandlesMyBase.LoadPreviewVideo(PictureBox1)EndSubPrivateSubButton1_Click(senderAsSystem.Object,eAsSystem.EventArgs)HandlesButton1.ClickDimdataAsIDataObjectDimbmapAsImageSendMessage(hWnd,WM_CAP_EDIT_COPY,0,0)data=Clipboard.GetDataObject()IfdataIsNothingThenExitSubIfdata.GetDataPresent(GetType(System.Drawing.Bitmap))Thenbmap=CType(data.GetData(GetType(System.Drawing.Bitmap)),Image)bmap.Save("d:b.bmp",System.Drawing.Imaging.ImageFormat.Bmp)MsgBox("完成")EndIfEndSubEndClass
解决方案
本帖最后由 ilshanghai 于 2012-03-24 15:17:23 编辑
解决方案二:
第二次是怎么运行的?是点击button还是重启程序?
解决方案三:
引用1楼chinajiyong的回复:
第二次是怎么运行的?是点击button还是重启程序?
重新启动调试,之后PictureBox1空白,拍照也不能拍了。
解决方案四:
整理一下再看ImportsSystem.Runtime.InteropServicesPublicClassForm1ConstWM_CAP_START=&H400SConstWS_CHILD=&H40000000ConstWS_VISIBLE=&H10000000ConstWM_CAP_DRIVER_CONNECT=WM_CAP_START+10ConstWM_CAP_DRIVER_DISCONNECT=WM_CAP_START+11ConstWM_CAP_EDIT_COPY=WM_CAP_START+30ConstWM_CAP_SEQUENCE=WM_CAP_START+62ConstWM_CAP_FILE_SAVEAS=WM_CAP_START+23ConstWM_CAP_SET_SCALE=WM_CAP_START+53ConstWM_CAP_SET_PREVIEWRATE=WM_CAP_START+52ConstWM_CAP_SET_PREVIEW=WM_CAP_START+50ConstSWP_NOMOVE=&H2SConstSWP_NOSIZE=1ConstSWP_NOZORDER=&H4SConstHWND_BOTTOM=1DimhWndAsIntegerDeclareFunctioncapGetDriverDescriptionALib"avicap32.dll"(ByValwDriverIndexAsShort,ByVallpszNameAsString,ByValcbNameAsInteger,ByVallpszVerAsString,ByValcbVerAsInteger)AsBooleanDeclareFunctioncapCreateCaptureWindowALib"avicap32.dll"(ByVallpszWindowNameAsString,ByValdwStyleAsInteger,ByValxAsInteger,ByValyAsInteger,ByValnWidthAsInteger,ByValnHeightAsShort,ByValhWndAsInteger,ByValnIDAsInteger)AsIntegerDeclareFunctionSendMessageLib"user32"Alias"SendMessageA"(ByValhwndAsInteger,ByValMsgAsInteger,ByValwParamAsInteger,<Runtime.InteropServices.MarshalAs(UnmanagedType.AsAny)>ByVallParamAsObject)AsIntegerDeclareFunctionSetWindowPosLib"user32"Alias"SetWindowPos"(ByValhwndAsInteger,ByValhWndInsertAfterAsInteger,ByValxAsInteger,ByValyAsInteger,ByValcxAsInteger,ByValcyAsInteger,ByValwFlagsAsInteger)AsIntegerDeclareFunctionDestroyWindowLib"user32"(ByValhndwAsInteger)AsBooleanPrivateSubPreviewVideo(ByValpbCtrlAsPictureBox)hWnd=capCreateCaptureWindowA(0,WS_VISIBLEOrWS_CHILD,0,0,0,0,pbCtrl.Handle.ToInt32,0)IfSendMessage(hWnd,WM_CAP_DRIVER_CONNECT,0,0)ThenSendMessage(hWnd,WM_CAP_SET_SCALE,True,0)SendMessage(hWnd,WM_CAP_SET_PREVIEWRATE,30,0)SendMessage(hWnd,WM_CAP_SET_PREVIEW,True,0)SetWindowPos(hWnd,HWND_BOTTOM,0,0,pbCtrl.Width,pbCtrl.Height,SWP_NOMOVEOrSWP_NOZORDER)ElseDestroyWindow(hWnd)EndIfEndSubPrivateSubForm1_Load(senderAsSystem.Object,eAsSystem.EventArgs)HandlesMyBase.LoadPreviewVideo(PictureBox1)EndSubPrivateSubButton1_Click(senderAsSystem.Object,eAsSystem.EventArgs)HandlesButton1.ClickDimdataAsIDataObjectDimbmapAsImageSendMessage(hWnd,WM_CAP_EDIT_COPY,0,0)data=Clipboard.GetDataObject()IfdataIsNothingThenExitSubIfdata.GetDataPresent(GetType(System.Drawing.Bitmap))Thenbmap=CType(data.GetData(GetType(System.Drawing.Bitmap)),Image)bmap.Save("d:b.bmp",System.Drawing.Imaging.ImageFormat.Bmp)MsgBox("完成")EndIfEndSubEndClass
解决方案五:
程序是不是没有安全退出?你看看进程里是不是有多个和你程序名一样的进程,或者在不运行程序的情况下去我的电脑里打开摄像头设备,看看能不能正常打开。上面步骤的目的是检查是否有程序占用了你的摄频设备。因为视频设备是独占使用的。在你使用摄像头之前要保证没有被其它进程占用。
解决方案六:
我的问题也是一样的,请问解决了吗?我的是每次重启之后就还能再运行一次。感觉是进程没有释放,但是又找不到!