修正过的摄像头类(.NET2.0)

原创 2006年05月29日 18:18:00
修正过的摄像头类(UserLib.Device.PCCamera)
 
原来的代码在.NET2.0下会抛出PInvokeStackImbalance异常,
所以我通过修改部分代码, 使其可以在.NET2.0下正常工作
 
注: 修改过的地方我加亮表示
 
以下是修改过的源代码:
using System;
using System.Runtime.InteropServices;
using System.Drawing;
using System.Drawing.Imaging;
 
namespace UserLib.Device
{
     ///<summary>
     ///一个控制摄像头的类
     ///</summary>
     public class PCCamera
     {
         private const int WM_USER = 0x400;
         private const int WS_CHILD = 0x40000000;
         private const int WS_VISIBLE = 0x10000000;
         private const int WM_CAP_START = WM_USER;
         private const int WM_CAP_STOP = WM_CAP_START + 68;
         private const int WM_CAP_DRIVER_CONNECT = WM_CAP_START + 10;
         private const int WM_CAP_DRIVER_DISCONNECT = WM_CAP_START + 11;
         private const int WM_CAP_SAVEDIB = WM_CAP_START + 25;
         private const int WM_CAP_GRAB_FRAME = WM_CAP_START + 60;
         private const int WM_CAP_SEQUENCE = WM_CAP_START + 62;
         private const int WM_CAP_FILE_SET_CAPTURE_FILEA = WM_CAP_START + 20;
         private const int WM_CAP_SEQUENCE_NOFILE =WM_CAP_START+ 63;
         private const int WM_CAP_SET_OVERLAY =WM_CAP_START+ 51;
         private const int WM_CAP_SET_PREVIEW =WM_CAP_START+ 50;
         private const int WM_CAP_SET_CALLBACK_VIDEOSTREAM = WM_CAP_START +6;
         private const int WM_CAP_SET_CALLBACK_ERROR=WM_CAP_START +2;
         private const int WM_CAP_SET_CALLBACK_STATUSA= WM_CAP_START +3;
         private const int WM_CAP_SET_CALLBACK_FRAME= WM_CAP_START +5;
         private const int WM_CAP_SET_SCALE=WM_CAP_START+ 53;
         private const int WM_CAP_SET_PREVIEWRATE=WM_CAP_START+ 52;
         private IntPtr hWndC;
         private bool bStat = false;
 
         private IntPtr mControlPtr;
         private int mWidth;
         private int mHeight;
         private int mLeft;
         private int mTop;
 
        [DllImport("avicap32.dll")]
        private static extern IntPtr capCreateCaptureWindowA(byte[] lpszWindowName, int dwStyle, int x, int y, int nWidth, int nHeight, IntPtr hWndParent, int nID);
 
        [DllImport("avicap32.dll")]
        private static extern int capGetVideoFormat(IntPtr hWnd, IntPtr psVideoFormat, int wSize);
 
        [DllImport("User32.dll")]
        private static extern bool SendMessage(IntPtr hWnd, int wMsg, IntPtr wParam, IntPtr lParam);
 
        ///<summary>
        ///初始化摄像头
        ///</summary>
        public PCCamera() { }
 
         ///<summary>
         ///初始化摄像头
         ///</summary>
         ///<param name="handle">控件的句柄</param>
         ///<param name="left">开始显示的左边距</param>
         ///<param name="top">开始显示的上边距</param>
         ///<param name="width">要显示的宽度</param>
         ///<param name="height">要显示的长度</param>
         public PCCamera(IntPtr handle, int left, int top, int width,int height)
         {
              mControlPtr = handle;
              mWidth = width;
              mHeight = height;
              mLeft = left;
              mTop = top;
          }
 
        ///<summary>
        ///获取或设置控件的句柄
        ///</summary>
        public IntPtr Handle
        {
            get
            {
                return mControlPtr;
            }
            set
            {
                mControlPtr = value;
            }
        }
 
        ///<summary>
        ///获取或设置显示的宽度
        ///</summary>
        public int Width
        {
            get
            {
                return mWidth;
            }
            set
            {
                mWidth = value;
            }
        }
 
        ///<summary>
        ///获取或设置显示的高度
        ///</summary>
        public int Height
        {
            get
            {
                return mHeight;
            }
            set
            {
                mHeight = value;
            }
        }
      
        ///<summary>
        ///获取或设置开始显示的左边距
        ///</summary>
        public int Left
        {
            get
            {
                return mLeft;
            }
            set
            {
                mLeft = value;
            }
        }
 
        ///<summary>
        ///获取或设置开始显示的上边距
        ///</summary>
        public int Top
        {
            get
            {
                return mTop;
            }
            set
            {
                mTop = 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);
 
              if (hWndC.ToInt32() != 0)
              {
                SendMessage(hWndC, WM_CAP_SET_CALLBACK_VIDEOSTREAM, IntPtr.Zero, IntPtr.Zero);
                SendMessage(hWndC, WM_CAP_SET_CALLBACK_ERROR, IntPtr.Zero, IntPtr.Zero);
                SendMessage(hWndC, WM_CAP_SET_CALLBACK_STATUSA, IntPtr.Zero, IntPtr.Zero);
                SendMessage(hWndC, WM_CAP_DRIVER_CONNECT, IntPtr.Zero, IntPtr.Zero);
                   SendMessage(hWndC, WM_CAP_SET_SCALE, new IntPtr(1), IntPtr.Zero);
                   SendMessage(hWndC, WM_CAP_SET_PREVIEWRATE, new IntPtr(66), IntPtr.Zero);
                SendMessage(hWndC, WM_CAP_SET_OVERLAY, new IntPtr(1), IntPtr.Zero);
                SendMessage(hWndC, WM_CAP_SET_PREVIEW, new IntPtr(1), IntPtr.Zero);
                
              }
 
              return;
 
         }
 
         ///<summary>
         ///停止显示
         ///</summary>
         public void Stop()
         {
            SendMessage(hWndC, WM_CAP_DRIVER_DISCONNECT, IntPtr.Zero, IntPtr.Zero);
              bStat = false;
         }
 
         ///<summary>
         ///抓图
         ///</summary>
         ///<param name="path">要保存bmp文件的路径</param>
         public void GrabImage(string path)
         {
              IntPtr hBmp = Marshal.StringToHGlobalAnsi(path);
            SendMessage(hWndC, WM_CAP_SAVEDIB, IntPtr.Zero, hBmp);
         }
 
         ///<summary>
         ///录像
         ///</summary>
         ///<param name="path">要保存avi文件的路径</param>
         public void Kinescope(string path)
         {
              IntPtr hBmp = Marshal.StringToHGlobalAnsi(path);
            SendMessage(hWndC, WM_CAP_FILE_SET_CAPTURE_FILEA, IntPtr.Zero, hBmp);
            SendMessage(hWndC, WM_CAP_SEQUENCE, IntPtr.Zero, IntPtr.Zero);
         }
 
         ///<summary>
         ///停止录像
         ///</summary>
         public void StopKinescope()
         {
            SendMessage(hWndC, WM_CAP_STOP, IntPtr.Zero, IntPtr.Zero);
         }
 
     }
}
 

使用DirectShow.NET获取摄像头视频流

开源社区提供了DirectShow的.NET版本,为C#开发者提供了便利。这里分享下如何用DirectShow.NET API来启动摄像头,以及获取视频流数据。 参考原文:Read Barcode ...
  • yushulx
  • yushulx
  • 2016年09月29日 10:37
  • 3443

.net2.0怎么无法安装?

.net2.0怎么无法安装?
  • luopeixin
  • luopeixin
  • 2005年04月26日 23:25
  • 932

Win10 安装 .NET 2.0 相对简单了

Win10 安装 .NET 2.0 相对简单了 以前版本,在 \Sources\sxs 目录下是一堆文件,现在,精简成了一个压缩包文件: "\\Server\Distribution\Op...
  • hadstj
  • hadstj
  • 2016年01月21日 09:52
  • 7432

vs2010 想用.net2.0,3,0或者其它低版本的框架的解决办法

好久没写博客了。这个可不好。要坚持。 公司用vs2010但是用2.0的框架,可是打开项目的属性查看,只有.net4.0的框架。 在网上找了很久没找到方法。最后在一片文章中找到地址。 转载...
  • mao2kun1
  • mao2kun1
  • 2011年08月28日 15:48
  • 4986

在64位Windows Server 2008r2 下设置ASP.NET2.0操作Word相关设置

1、开始->运行,输入 mmc -32,打开控制台。2、打开文件->添加/删除管理单元,选择组件服务并加入。3、找到dcom配置->microsoft word文档,选择安全->自定义,添加every...
  • wxw_317
  • wxw_317
  • 2011年03月03日 14:34
  • 2062

关于Android摄像头操作设置的工具类

使用时打开摄像头的方法  /**      * 根据CameraTag 初始化前置或后置摄像头      */     void openAndInitCamera(){         i...
  • Condottierezhoujw
  • Condottierezhoujw
  • 2016年11月23日 18:43
  • 1116

socket 修改本机IP

int SetLocalIp( const char *ipaddr )   {          int sock_set_ip;              struct sockaddr...
  • zynq_xilinx
  • zynq_xilinx
  • 2016年12月28日 09:18
  • 55

Windows Server 2012 安装.NET2.0-3.5的方法

WIN8下安装.NET2.0-3.5的方法网上大把,自行查找 Windows Server 2012 安装.NET2.0-3.5的方法与和WIN8下的安装方法不同,首先提取Windows Serve...
  • hpnets
  • hpnets
  • 2015年02月23日 15:18
  • 2980

64位WIN10下安装.net2.0

1.  下载Microsoft .NET Framework 2.0 软件开发工具包 (SDK) (x64) 来源:https://www.microsoft.com/zh-CN/downlo...
  • quicksand201
  • quicksand201
  • 2017年07月06日 08:44
  • 3525

.NET2.0程序 在.net 4.0 中运行的解决方案

问题描述: .NET Framework 4 不能自动使用自己的公共语言运行时版本来运行由 .NET Framework 早期版本生成的应用程序。 若要使用 .NET Framework 4 运行较...
  • yingwang9
  • yingwang9
  • 2016年08月01日 17:22
  • 366
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:修正过的摄像头类(.NET2.0)
举报原因:
原因补充:

(最多只允许输入30个字)