如有雷同,不胜荣幸,若转载,请注明

这个是大众普通方法,鉴于有网友和朋友问相同的问题。在这里将我的拙劣的代码关键部分贴出来。以便帮助很多其它的朋友们,不足之处甚多,我能够学习,交流,请教阁下

废话到此。直接上代码

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); 

        }

C# 操作摄像头的更多相关文章

  1. C# 调用AForge类库操作摄像头

    如有雷同,不胜荣幸,若转载,请注明 最近做项目需要操作摄像头,在网上百度了很多资料,很多都是C#调用window API 发送SendMessage,实现操作摄像头,但是C#调用window API的 ...

  2. C#操作摄像头 实现拍照功能

    从正式工作以来一直做的都是基于B/S的Web开发,已经很长时间不研究C/S的东西了,但是受朋友的委托,帮他做一下拍照的这么个小功能.其实类似的代码网上有很多,但是真的能够拿来运行的估计也没几个.本来是 ...

  3. 转:C#操作摄像头

    转自: http://blog.csdn.NET/chenhongwu666/article/details/40594365 如有雷同,不胜荣幸,若转载,请注明 最近做项目需要操作摄像头,在网上百度 ...

  4. Web操作摄像头、高拍仪、指纹仪等设备的功能扩展方案

    摘要:信息系统开发中难免会有要操作摄像头.高拍仪.指纹仪等硬件外设,异或诸如获取机器签名.硬件授权保护(加密锁)检测等情况.受限于Web本身运行机制,就不得不使用Active.浏览器插件进行能力扩展了 ...

  5. Android实例-操作摄像头(XE8+小米2)

    结果: 1.同样是照相,自己的程序设置为高质量时刷新慢,而小米手机的相机那真心反映快呀. 2.就算我设置为最高质量,可相片也没有小米手机的相片大.我最大是2000*1000,而小米可以做到3000*2 ...

  6. JS操作摄像头

    <script src="javascript/jquery-1.9.1.min.js"></script> <fieldset> <le ...

  7. Python操作摄像头

    实践环境: 操作系统:Windows 7(X64) Python版本:python-2.7.13.msi 使用插件:pygame-1.9.1.win32-py2.7.msi 软件下载: python- ...

  8. C#对摄像头的操作示例,采用Aforge库

    操作摄像头有三个办法:VFW.DirectShow.花钱买第三方控件 VFW技术比较古老,无法解决驱动不完善造成的某些问题 DirectShow技术相对完善一些,但这是C++才能实现的技术.如果用.N ...

  9. 在WPF中使用AForge.net控制摄像头拍照

    原文:在WPF中使用AForge.net控制摄像头拍照 利用AForge.net控制摄像头拍照最方便的方法就是利用PictureBox显示摄像头画面,但在WPF中不能直接使用PictureBox.必须 ...

随机推荐

  1. 聊聊、Nginx 安装启动

    首先说下安装 Nginx 的步骤: (1)window 下安装 进入 http://nginx.org/en/download.html 下载版本 Mainline version 或者 Stable ...

  2. [Android Studio篇][1] AS开发中遇到问题汇总

    1 在android新建文件,提示权限不够,增加权限 修改工程下 main/AndroidMainfest.xml增加 <uses-permission android:name="a ...

  3. springboot添加外部jar包及打包

    项目中除了从pom中添加依赖包,还可以添加本地的jar包,怎么做呢? 1.在src下新建目录lib,将jar包添加到lib中 2.在pom文件里添加配置以下属性,就可以使用jar包了 <depe ...

  4. 【Luogu】P2962灯Lights(折半搜索)

    题目链接 本意是想学高斯消元,然后一顿乱搞之后学到了一个神奇的搜索方式叫做折半搜索. qwq 就是我先dfs前二分之n个点,然后再dfs后二分之n个点. 然后我dfs后二分之n个点的时候判断一下第一次 ...

  5. kb-07线段树-08--区间开根

    /* hdu-4027 题目:区间开根求和查询: 因为是开根,所以要更新的话就要更新到叶子节点.如果区间里全是1或是0的话就步用继续更新了,查询的时候正常查询: */ #include<iost ...

  6. wampSever的mysql操作

    单击wampserver图标,选择mysql console 输入密码 123qwe,root用户默认密码为空 mysql客户端管理工具使用wampserver自带的phpmyadmin

  7. [BZOJ4318] WJMZBMR打osu! / Easy (期望DP)

    题目链接 Solution Wa,我是真的被期望折服了,感觉这道题拿来练手正好. DP的难度可做又巧妙... 我们定义: \(f[i]\) 代表到第 \(i\) 次点击的时候的最大答案. \(g[i] ...

  8. iOS-文件断点续传

    * 移动客户端在和服务器交互的时候,上传和下载使用十分广泛. * 在我们下载文件的时候,我们在点击暂停的时候可以暂停下载,点击下载的时候可以继续下载,这个功能如何实现? * 下载进度条如何显示? 先大 ...

  9. jenkins+maven+testng参数化执行测试用例

    碰到一个场景是,在做自动化中,一个系统往往需要兼容很多浏览器,如何在一个工程中,通过参数化去启动不同的浏览器,而无需改动配置文件呢? 我解决的思路是: 1.通过jenkins的参数传递给maven 2 ...

  10. Docker 通俗易懂的入门

    这篇转的文章讲的通俗易懂,算个入门的东西了- 转自:http://www.csdn.net/article/2014-07-02/2820497-what's-docker 尽管之前久闻Docker的 ...