通过C#代码实现开启摄像头,截图,录像等功能

2023-11-03

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.InteropServices;

class WebCam
    {

        const int WM_USER = 0x400;
        const int WS_CHILD = 0x40000000;
        const int WS_VISIBLE = 0x10000000;
        const int WM_CAP_START = WM_USER;
        const int WM_CAP_STOP = WM_CAP_START + 68;
        const int WM_CAP_DRIVER_CONNECT = WM_CAP_START + 10;
        const int WM_CAP_DRIVER_DISCONNECT = WM_CAP_START + 11;
        const int WM_CAP_SAVEDIB = WM_CAP_START + 25;
        const int WM_CAP_GRAB_FRAME = WM_CAP_START + 60;
        const int WM_CAP_SEQUENCE = WM_CAP_START + 62;
        const int WM_CAP_FILE_SET_CAPTURE_FILEA = WM_CAP_START + 20;
        const int WM_CAP_SEQUENCE_NOFILE = WM_CAP_START + 63;
        const int WM_CAP_SET_OVERLAY = WM_CAP_START + 51;
        const int WM_CAP_SET_PREVIEW = WM_CAP_START + 50;
        const int WM_CAP_SET_CALLBACK_VIDEOSTREAM = WM_CAP_START + 6;
        const int WM_CAP_SET_CALLBACK_ERROR = WM_CAP_START + 2;
        const int WM_CAP_SET_CALLBACK_STATUSA = WM_CAP_START + 3;
        const int WM_CAP_SET_CALLBACK_FRAME = WM_CAP_START + 5;
        const int WM_CAP_SET_SCALE = WM_CAP_START + 53;
        const int WM_CAP_SET_PREVIEWRATE = WM_CAP_START + 52;
        const int WM_CAP_SET_EDIT_COPY = WM_CAP_START + 30;
        IntPtr hWndc;
        bool bStat;
        IntPtr mControlPtr;
        int mWidth;
        int mHeight;
        int mLeft;
        int mTop;
        string grabImagePath = "";
        string kinescopePath = "";
        /// <summary>
        /// 初始化摄像头
        /// </summary>
        /// <param name="handle">控件句柄</param>
        /// <param name="left"></param>
        /// <param name="top"></param>
        /// <param name="width"></param>
        /// <param name="height"></param>
        public WebCam(IntPtr handle,int left,int top,int width,int height)
        {
            mControlPtr = handle;
            mLeft = left;
            mTop = top;
            mWidth = width;
            mHeight = height;
        }

        public int Left
        {
            get { return mLeft; }
            set { mLeft = value; }
        }
        public int Top
        {
            get { return mTop;
            
            }
            set
            {
                mTop = value;
            }
        }
        public int Width
        {
            set
            {
                mWidth = value;
            }
            get
            {
                return mWidth;
            }
        }
        public int Height
        {
            set
            {
                mHeight = value;
            }
            get
            {
                return mHeight;
            }
        }
        /// <summary>
        /// 截图存放路径
        /// </summary>
        public string GrabImagePath
        {
            get
            {
                return grabImagePath;
            }

            set
            {
                grabImagePath = value;
            }
        }
        /// <summary>
        /// 录像存放路径
        /// </summary>
        public string KinescopePath
        {
            get
            {
                return kinescopePath;
            }

            set
            {
                kinescopePath = value;
            }
        }
        /// <summary>
        /// 启动摄像头
        /// </summary>
        public void Start()
        {
            if (bStat)
                return;
            bStat = true;
            byte[] lpszName = new byte[100];
            hWndc = capCreateCaptureWindowA(lpszName, WS_CHILD | WS_VISIBLE, mLeft, mTop, mWidth, mHeight, mControlPtr, 0);
            bool flag = false;
            if(hWndc.ToInt32()!=0)
            {
                SendMessage(hWndc, WM_CAP_SET_CALLBACK_VIDEOSTREAM, 0, 0);
                SendMessage(hWndc, WM_CAP_SET_CALLBACK_ERROR, 0, 0);
                SendMessage(hWndc, WM_CAP_SET_CALLBACK_STATUSA, 0, 0);
                while (true)
                {
                    flag = SendMessage(hWndc, WM_CAP_DRIVER_CONNECT, 0, 0);
                    if (flag) break;
                }
                SendMessage(hWndc, WM_CAP_SET_SCALE, 1, 0);
                SendMessage(hWndc, WM_CAP_SET_PREVIEWRATE, 66, 0);
                SendMessage(hWndc, WM_CAP_SET_OVERLAY, 1, 0);
                SendMessage(hWndc, WM_CAP_SET_PREVIEW, 1, 0);

            }
            return;
        }
        /// <summary>
        /// 停止摄像
        /// </summary>
        public void Stop()
        {
            SendMessage(hWndc, WM_CAP_DRIVER_DISCONNECT, 0, 0);
            bStat = false;
        }   
         /// <summary>
         /// 抓图
         /// </summary>
        public void GrabImage()
        {
            IntPtr hBmp = Marshal.StringToHGlobalAnsi(GrabImagePath);
            SendMessage(hWndc, WM_CAP_SAVEDIB, 0, hBmp.ToInt32());
        }
        /// <summary>
        /// 录像
        /// </summary>
        public void Kinescope()
        {
            IntPtr hBmp = Marshal.StringToHGlobalAnsi(KinescopePath);
            SendMessage(hWndc, WM_CAP_FILE_SET_CAPTURE_FILEA, 0, hBmp.ToInt32());
            SendMessage(hWndc, WM_CAP_SEQUENCE, 0, 0);
        }
        /// <summary>
        /// 将摄像头一帧数据存放在剪切板上
        /// </summary>
        public void CapturePicture()
        {
            SendMessage(hWndc, WM_CAP_SET_PREVIEWRATE, 125, 0);
            SendMessage(hWndc, WM_CAP_SET_EDIT_COPY, 0, 0);
        }
       public void StopKinescope()
        {
            SendMessage(hWndc, WM_CAP_STOP, 0, 0);
        }

        /// <summary>
        /// 创建一个视频捕捉窗口
        /// </summary>
        /// <param name="lpszWindowsName">标识窗口的名字</param>
        /// <param name="dwStyle">标识窗口的风格</param>
        /// <param name="x">标识窗口的左上角x点</param>
        /// <param name="y">标识窗口的左上角y点</param>
        /// <param name="nWidth">标识窗口的宽度</param>
        /// <param name="nHeight">标识窗口的高度</param>
        /// <param name="hWndParent">标识父窗口句柄</param>
        /// <param name="nID">标识窗口ID</param>
        /// <returns>视频捕捉窗口句柄</returns>
        [DllImport("avicap32.dll")]
        static extern IntPtr capCreateCaptureWindowA(byte[] lpszWindowsName, int dwStyle, int x, int y, int nWidth, int nHeight, IntPtr hWndParent, int nID);
        [DllImport("avicap32.dll")]
        static extern int capGetVideoFormat(IntPtr hWnd, IntPtr psVideoFormat, int wSize);
        /// <summary>
        /// 向windows系统发送消息
        /// </summary>
        /// <param name="hWhd">窗口句柄</param>
        /// <param name="msg">发送的消息</param>
        /// <param name="wParam">消息参数</param>
        /// <param name="lParam">消息参数</param>
        /// <returns></returns>
        [DllImport("User32.dll")]
        static extern bool SendMessage(IntPtr hWhd, int msg, int wParam, int lParam);
    }

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

通过C#代码实现开启摄像头,截图,录像等功能 的相关文章

  • 读取STM32 MCU SPI数据寄存器的值

    有很多类似的问题 但似乎没有一个问题完全相同 我正在将 STML4 MCU 连接到 6 轴传感器 LSM6DS3 我已经成功地在 I2C 中实现了所有内容 但想要 SPI 的额外速度 和 DMA 如果我能让这些第一步工作起来的话 因此 第一
  • 在 Apache Servicemix 4 中的 OSGi 包之间共享配置文件?

    有人能够在 SMX4 中的两个或多个捆绑包之间成功共享配置吗 我正在寻找的是这样的 有一个文件 SMX HOME etc myconfiguration cfg 使此配置 可用 以便使用 Spring dm 通过 OSGi 配置管理将其注入
  • 如何强制用户仅使用“new”创建从我派生的类的对象?

    为了实现引用计数 我们使用IUnknown http msdn microsoft com en us library ms680509 VS 85 aspx类接口和智能指针模板类 该接口具有所有引用计数方法的实现 包括Release vo
  • JavaFX Integer Spinner (IntegerSpinnerValueFactory) 不会将值回绕到最小值

    我创建了一个带有值的整数微调器 min 5 max 15 and initialValue 12 and wrapAround true 一旦旋转器到达max 15 增量期间的值 而不是将值重置为min 5 正如它所说文档 https op
  • Eclipse Juno 指标插件

    Eclipse JUNO 版本有哪些 Eclipse 指标插件 我尝试了一些通用指标插件 但没有一个能够在 Eclipse 的 JUNO 版本中正常运行 差点忘了 我们正在使用 Java 作为编程语言 我想要诸如圈复杂度 代码行数 方法长度
  • ASP.NET MVC 路由 - 向路由添加 .html 扩展名

    我对 MVC 和路由非常陌生 我被要求修改一个应用程序以使用不同的 url 由于我没有经验 这项任务对我来说有点困难 好吧 让我们谈谈一些代码 routes MapRoute CategoryBySeName Route name prod
  • 带等待/通知的同步块与不带等待/通知的同步块之间的区别?

    如果我只是使用synchronized 不是wait notify方法 它仍然是线程安全的吗 有什么不同 Using synchronized使方法 块一次只能由一个线程访问 所以 是的 它是线程安全的 这两个概念是结合在一起的 而不是相互
  • 将一个整数从 C 客户端发送到 Java 服务器

    我使用此代码将一个整数从我的 Java 客户端发送到我的 Java 服务器 int n rand nextInt 50 1 DataOutputStream dos new DataOutputStream socket getOutput
  • 使用宏计算源文件行数?

    是否可以使用 C C 预处理器将源文件中的行数计算为宏或某种编译时可用值 例如 我可以更换吗MAGIC1 MAGIC2 and MAGIC3在下面 并在使用时以某种方式获取值 4MAGIC3 MAGIC1 can be placed whe
  • 只读有运行时开销吗?

    出于某种原因 我一直认为readonly字段有与其相关的开销 我认为这是 CLR 跟踪是否存在readonly字段是否已初始化 这里的开销是一些额外的内存使用量 用于跟踪状态以及分配值时的检查 也许我这么认为是因为我不知道readonly字
  • TreeView:仅在子节点中存在复选框

    我需要一个树视图控件 根节点没有复选框 只有图像 所有子节点都有一个复选框 图像 C net 2 0 winforms 不是 wpf WinForms树视图默认不支持混合复选框 非复选框节点 您可以在树视图上全局启用复选框 并使用以下命令在
  • 对于双核手机,availableProcessors() 返回 1

    我最近购买了一部 Moto Atrix 2 手机 当我尝试查看手机中的处理器规格时 Runtime getRuntime availableProcessors 返回 1 proc cpuinfo 也仅包含有关处理器 0 的信息 出于好奇
  • 如何在 Hibernate 中自动递增复合主键中的 Id?

    我有一个带有复合主键的表 groupId and batchId 实体类看起来像 Entity name EMPLOYEE public class Employee EmbeddedId private EmployeePK employ
  • Android - 从渲染线程内结束活动

    下午好 我不熟悉 android 中的活动生命周期 并且一直在尽可能地阅读 但我不知道如何以良好的方式解决以下问题 我有一个使用 GLSurfaceView 的活动来在屏幕上绘制各种内容 在这个 GLSurfaceView 的渲染线程中 我
  • 在 servlet 会话和 java.io.NotSerializedException 中保存对象

    SEVERE IOException while loading persisted sessions java io WriteAbortedException writing aborted java io NotSerializabl
  • 为什么调试器只显示数组指针中的一个元素?

    首先 我知道new是执行此操作的 C 方法 我只是表明有不止一种方法可以重现此错误 而且两种方法都令人难以置信的令人沮丧 我有两种形式的源文件 我正在尝试调试另一个编程作业 但我并没有寻求帮助 基本上 我正在尝试重新实施set作为一个类 具
  • 如何在 Winform DataGridView 中创建不同的单元格格式

    我有一个 DataGridView 我将其绑定到 DataTable DataTable 是一个全数字值 要求 DataGridView 中的每 n 行都包含文本 而不是数值 以便在视觉上为用户分隔部分 我很高兴在绑定后将此文本数据放入 D
  • 获取会议组织者邮件地址 EWS API

    我想使用 EWS API 获取会议组织者的邮件地址 目前 我刚刚获得约会项目的一些属性 我听说你可以设置你想要获取哪些属性 我的代码看起来像这样 CalendarView cview new CalendarView start end c
  • 清理堆分配对象的良好实践或约定?

    我正在学习C 我有 C C ObjC 背景 相当高级的语言 在 C 或 ObjC 上 作为函数或方法的结果返回堆分配的对象是很简单的 因为对象的清理是受管理的 按照惯例 会在适当的时候销毁 但我不知道在 C 中应该如何处理这个问题 例如 s
  • 如何在没有 Visual Studio 的情况下将新文件添加到 .csproj 文件

    如何添加新文件到 csproj从命令提示符 我认为没有任何工具可以响应命令行上的 add project 命令来执行此操作 但我认为您可以幸运地创建一个程序 脚本来直接操作 csproj 文件的 XML 内容 csproj 文件的结构如下所

随机推荐

  • flask-sqlalchemy插件使用

    1 Flask SQLAlchemy插件的使用 该插件对SQLAlchemy进行了简单的封装 使得我们可以更加简单的使用 初始化数据库 无需导入create engine from flask import Flask from flask
  • win10怎么设置WiFi与有线优先级

    原文 https blog csdn net u010921682 article details 88964982 经过测试 文章中第二种方式有效 不过我的优先级与原文中的不同 我是wifi优先于有线 如下 二 修改 接口跃点数 这个名词
  • Android的中http协议HttpURLConnection中post请求

    public class MainActivity extends AppCompatActivity private TextView textView Override protected void onCreate Bundle sa
  • Idea里面关于时间date报错Unhandled exception: java.text.ParseException的解决方案

    我一直报这个错找不到 结果是因为我导包的原因 idea自动导包导出来是这个 但是咱们需要的是这个 就不报错了
  • Lerna包管理

    认识lerna 导读 本章节主要讲解Lerna是什么 Lerna有什么用 如何使用Lerna进行npm包管理 大厂的Lerna版本管理策略是怎么做的 Lerna是如何实现本地包依赖管理以及底层原理是什么 读者可以带着这些问题去阅读 使学习事
  • 利用jni将Eclipse与C++、Opencv无缝连接

    利用jni将Eclipse与C Opencv无缝连接 博主 w风的季节 日期 2018 4 11 现在越来越多的大学生实验室或者创新项目需要用到将JAVA与C 之间的混合编程 因此本篇就来讲解一下Eclipse中用java写的APP如何将C
  • Spring Boot favicon.ico自定义设置

    做网页的都知道 网页打开后几乎都会有一个favicn的小图标 但是在spring boot中如何设置呢 下面告诉大家一个自定制的方法 非常简单 1 在配置application properties中加入 spring mvc favico
  • 信息熵,信息增益

    信息熵 信息增益 概要 实例一 实例二 概要 信息增益表示得知特征A的信息而使得类Z的信息的不确定性减少的程度 特征A对数据集D的信息增益 G D A 定义为集合的信息熵 H D 与特征A给定条件下D的信息条件熵 H D A 之差 即公式为
  • 机器学习入门-提取文章的主题词 1.jieba.analyse.extract_tags(提取主题词)

    1 jieba analyse extract tags text text必须是一连串的字符串才可以 第一步 进行语料库的读取 第二步 进行分词操作 第三步 载入停用词 同时对分词后的语料库进行停用词的去除 第四步 选取一段文本分词列表
  • 关于ASP.NET邮件发送的学习心得

    ASP net邮件发送是一种非常常见的功能 它可以让我们在网站中实现发送邮件的功能 比如用户注册成功后发送欢迎邮件 或者是找回密码时发送重置密码邮件等等 在学习ASP net邮件发送的过程中 我总结了以下几点心得 一 SMTP服务器的配置
  • 【解决问题】Transaction was marked for rollback only; cannot commit

    问题现象 导入文件的时候直接报错 Transaction was marked for rollback only cannot commit nested exception is org hibernate TransactionExc
  • JavaScript运算符详解

    JavaScript运算符详解 目录 JavaScript运算符详解 1 算术运算符 1 1 加法运算符 1 1 1 基本运算规则 1 1 2 对象的相加 1 2 余数运算符 1 3 自增和自减运算符 1 4 正负数值运算符 1 5 指数运
  • C单元测试框架——CMockery (3)中文手册

    Cmockery 单元测试框架 翻译的匆忙 没有校验 纰漏之处感谢请指正 转载请注明来自 see see 版权归原文 所有 Cmockery 是一个轻量级的库 作者用它来做C单元测试 目录 动机 概述 执行测试 异常处理 出错处理 断言 断
  • 河南省历年高考人数(2004-2021)

    一年一度高考时 我的高考已经过去15年了 河南高考人数创了新高 搜了一下历年人数 自己画了一个图
  • 前端XMLHttpRequest发送请求

    export function filePreview fileName ftpDownloadPath departmentId let mockXHR new XMLHttpRequest mockXHR open post baseU
  • python中的is None和==None

    1 python代码if not x 和if x is not None 和if not x is None 使用 2 python 中None is 和 的深入探讨 3 Python中为什么要用 is None 来代替 None
  • 服务器怎么设置虚拟网卡,VMWare虚拟网卡配置

    VMWare提供了三种工作模式 它们是bridged 桥接模式 NAT 网络地址转换模式 和host only 主机模式 要想在网络管理和维护中合理应用它们 你就应该先了解一下这三种工作模式 1 bridged 桥接模式 在这种模式下 VM
  • 计算机网路实验三 TCP和UDP协议分析

    计算机网路实验三 TCP和UDP协议分析 一 实验目的及任务 1 熟悉TCP UDP的协议基本原理 2 利用Wireshark对TCP和UDP进行协议分析 二 实验环境 与因特网连接的计算机网络系统 操作系统为windows Wiresha
  • EGL Error : Could not create the egl surface: error = 0x3003

    这个错误一般是屏幕位深参数不正确导致的 修改屏幕对应的fb参数即可 16 24 32等 echo 16 gt sys class graphics fb0 bits per pixel 这里我的屏幕对应的是fb0 如果是屏和fb不对应 也可
  • 通过C#代码实现开启摄像头,截图,录像等功能

    using System using System Collections Generic using System Linq using System Text using System Threading Tasks using Sys