如有雷同,不胜荣幸,若转载,请注明
这个是大众普通方法,鉴于有网友和朋友问同样的问题,在这里将我的拙劣的代码关键部分贴出来,以便帮助更多的朋友们,不足之处甚多,我可以学习,交流,请教阁下
废话到此,直接上代码
private const int WS_CHILD = 0x40000000; //1073741824 private const int WS_VISIBLE = 0x10000000; //268435456 private const int WM_USER = 0x400; //1024 private const int WM_CAP_START = WM_USER; //1024 private const int WM_CAP_STOP = WM_CAP_START + 68; //1092 private const int WM_CAP_DRIVER_CONNECT = WM_CAP_START + 10; //1034 private const int WM_CAP_DRIVER_DISCONNECT = WM_CAP_START + 11; //1035 private const int WM_CAP_SAVEDIB = WM_CAP_START + 25; //1049 private const int WM_CAP_GRAB_FRAME = WM_CAP_START + 60; //1084 private const int WM_CAP_SEQUENCE = WM_CAP_START + 62; //1086 private const int WM_CAP_FILE_SET_CAPTRUE_FILEA = WM_CAP_START + 20; //1044 private const int WM_CAP_SEQUENCE_NOFILE = WM_CAP_START + 63; //1087 private const int WM_CAP_CAPTURE_IMAGE_CLIPBOARD = WM_CAP_START + 30; //1054 复制捕捉的图像到剪切板 private const int WM_CAP_SET_OVERLAY = WM_CAP_START + 51; //1075 private const int WM_CAP_SET_PREVIEW = WM_CAP_START + 50; //1074 private const int WM_CAP_SET_CALLBACK_VIDEOSTREAM = WM_CAP_START + 6; //1030 private const int WM_CAP_SET_CALLBACK_ERROR = WM_CAP_START + 2; //1026 private const int WM_CAP_SET_CALLBACK_STATUSA = WM_CAP_START + 3; //1027 private const int WM_CAP_SET_CALLBACK_FRAME = WM_CAP_START + 5; //1029 private const int WM_CAP_SET_SCALE = WM_CAP_START + 53; //1077 private const int WM_CAP_SET_PREVIEWRATE = WM_CAP_START + 52; //1076 private const int WM_CAP_DLG_VIDEOSOURCE = WM_CAP_START + 42; //1066 选择摄像头
/// <summary> /// 开启视频摄像头 /// </summary> /// <returns></returns> public static void Start() { if (bWorkStart) { return; } byte[] lpszName = new byte[100]; try { hWndC = Windows.capCreateCaptureWindow(lpszName, WS_CHILD | WS_VISIBLE, mLeft, mTop, mWidth, mHeight, mControlPtr, 0); if (hWndC.ToInt32() != 0) { Windows.SendMessage(hWndC, WM_CAP_SET_CALLBACK_VIDEOSTREAM, 0, 0); //设置返回视频流 Windows.SendMessage(hWndC, WM_CAP_SET_CALLBACK_ERROR, 0, 0); //设置返回错误 Windows.SendMessage(hWndC, WM_CAP_SET_CALLBACK_STATUSA, 0, 0); //设置返回状态 //=====================这条比较慢======================= Windows.SendMessage(hWndC, WM_CAP_DRIVER_CONNECT, 0, 0); //设备连接 //===================================================== //Windows.SendMessage(hWndC, WM_CAP_SEQUENCE, 0, 0); //开始捕捉 //===================================================== Windows.SendMessage(hWndC, WM_CAP_SET_SCALE, 1, 0); //设置比例 Windows.SendMessage(hWndC, WM_CAP_SET_PREVIEWRATE, 66, 0); //设置预览速度 Windows.SendMessage(hWndC, WM_CAP_SET_OVERLAY, 1, 0); //设置叠加 Windows.SendMessage(hWndC, WM_CAP_SET_PREVIEW, 1, 0); //设置预览
bWorkStart = true; } //return true; } catch (Exception) { //return false; } //finally //{ //写日志 Global.log.Write( “SendMessage “); //LogClass.WriteLog("SendMessage"); //} }
/// <summary> /// 关闭视频摄像头 /// </summary> public static void Stop() { Windows.SendMessage(hWndC, WM_CAP_DRIVER_DISCONNECT, 0, 0); bWorkStart = false; }
/// <summary> /// 抓图或者拍照,然后保存到指定路径下 /// </summary> /// <param name="path">要保存bmp文件的路径</param> public static void GrabImage(string path) { IntPtr hBmp = Marshal.StringToHGlobalAnsi(path); Windows.SendMessage(hWndC, WM_CAP_SAVEDIB, 0, hBmp.ToInt32()); //0x41e }
/// <summary> /// 捕捉图像复制到剪切板 /// </summary> /// <returns></returns> public static bool CopyToClipBoard() { return Windows.SendMessage(hWndC, WM_CAP_CAPTURE_IMAGE_CLIPBOARD, 0, 0); }
|
请发表评论