• .net创建activex实现摄像头拍照


    using System.Reflection;
    using System.Runtime.CompilerServices;
    using System.Runtime.InteropServices;
    
    // 有关程序集的常规信息通过以下
    // 特性集控制。更改这些特性值可修改
    // 与程序集关联的信息。
    [assembly: AssemblyTitle("TestActiveX")]
    [assembly: AssemblyDescription("")]
    [assembly: AssemblyConfiguration("")]
    [assembly: AssemblyCompany("")]
    [assembly: AssemblyProduct("TestActiveX")]
    [assembly: AssemblyCopyright("Copyright ©  2014")]
    [assembly: AssemblyTrademark("")]
    [assembly: AssemblyCulture("")]
    
    // 将 ComVisible 设置为 false 使此程序集中的类型
    // 对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型,
    // 则将该类型上的 ComVisible 特性设置为 true。
    [assembly: ComVisible(true)]
    
    // 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID
    [assembly: Guid("0914bbdc-9ef9-4373-951d-d8c0a2b28348")]
    [assembly:System.Security.AllowPartiallyTrustedCallers()]
    // 程序集的版本信息由下面四个值组成:
    //
    //      主版本
    //      次版本 
    //      生成号
    //      修订号
    //
    // 可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值,
    // 方法是按如下所示使用“*”:
    // [assembly: AssemblyVersion("1.0.*")]
    [assembly: AssemblyVersion("1.0.0.0")]
    [assembly: AssemblyFileVersion("1.0.0.0")]
    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Runtime.InteropServices;
    
    namespace TestActiveX
    {
        //Guid唯一,不可变更,否则将无法通过IE浏览器的ActiveX控件的安全认证   
        [ComImport, Guid("CB5BDC81-93C1-11CF-8F20-00805F2CD064")]
        [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
        public interface IObjectSafety
        {
            [PreserveSig]
            void GetInterfacceSafyOptions(
            int riid,
            out int pdwSupportedOptions,
            out int pdwEnabledOptions);
    
            [PreserveSig]
            void SetInterfaceSafetyOptions(
            int riid,
            int dwOptionsSetMask,
            int dwEnabledOptions);
        }
    }
    
    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Runtime.InteropServices;
    
    namespace TestActiveX
    {
        public class WebCam
        {
            #region 参数
            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;
            private string GrabImagePath = "";
            private string KinescopePath = "";
            #endregion
    
            /// <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;
                mWidth = width;
                mHeight = height;
                mLeft = left;
                mTop = top;
            }
    
            #region "属性设置"
            /// <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 int Width
            {
                get { return mWidth; }
                set { mWidth = value; }
            }
    
            /// <summary>
            /// 视频高度
            /// </summary>
            public int Height
            {
                get { return mHeight; }
                set { mHeight = value; }
            }
    
            /// <summary>
            /// 抓图文件存放路径
            /// 例:d:a.bmp
            /// </summary>
            public string grabImagePath
            {
                get { return GrabImagePath; }
                set { GrabImagePath = value; }
            }
    
            /// <summary>
            /// 录像文件存放路径
            /// 例:d:a.avi
            /// </summary>
            public string kinescopePath
            {
                get { return KinescopePath; }
                set { KinescopePath = value; }
            }
            #endregion
    
            [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, int wParam, long lParam);
    
            /// <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, 0, 0);
                    SendMessage(hWndC, WM_CAP_SET_CALLBACK_ERROR, 0, 0);
                    SendMessage(hWndC, WM_CAP_SET_CALLBACK_STATUSA, 0, 0);
                    SendMessage(hWndC, WM_CAP_DRIVER_CONNECT, 0, 0);
                    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.ToInt64());
            }
    
            /// <summary>
            /// 录像
            /// </summary>
            public void Kinescope()
            {
                IntPtr hBmp = Marshal.StringToHGlobalAnsi(KinescopePath);
                SendMessage(hWndC, WM_CAP_FILE_SET_CAPTURE_FILEA, 0, hBmp.ToInt64());
                SendMessage(hWndC, WM_CAP_SEQUENCE, 0, 0);
            }
    
            /// <summary>
            /// 停止录像
            /// </summary>
            public void StopKinescope()
            {
                SendMessage(hWndC, WM_CAP_STOP, 0, 0);
            }
    
        }
    }
    
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Drawing;
    using System.Data;
    using System.Text;
    using System.Windows.Forms;
    using System.Runtime.InteropServices;
    
    namespace TestActiveX
    {
        [Guid("412DE68D-3082-4C67-83FC-DBFBBFA9597B"), ComVisible(true)]
        public partial class MyActiveXControl : UserControl, IObjectSafety
        {
            #region IObjectSafety 成员 用于ActiveX控件安全信任
            public void GetInterfacceSafyOptions(int riid, out int pdwSupportedOptions, out int pdwEnabledOptions)
            {
                pdwSupportedOptions = 1;
                pdwEnabledOptions = 2;
            }
    
            public void SetInterfaceSafetyOptions(int riid, int dwOptionsSetMask, int dwEnabledOptions)
            {
                throw new NotImplementedException();
            }
            #endregion
    
            /// <summary>
            /// 摄像头驱动对象
            /// </summary>
            public WebCam webCame = null;
    
            public MyActiveXControl()
            {
                InitializeComponent();
    
                //开启摄像头
                start();
            }
    
            private void start()
            {
                //以panel1为容器显示视频内容
                webCame = new WebCam(panel1.Handle, 0, 0, this.panel1.Width, this.panel1.Height);
                webCame.Start();
            }
    
            /// <summary>
            /// 开启摄像头
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void btnStart_Click(object sender, EventArgs e)
            {
                webCame.Start();
            }
    
            /// <summary>
            /// 停止摄像头
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void btnStop_Click(object sender, EventArgs e)
            {
                webCame.Stop();
            }
    
            /// <summary>
            /// 截图
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void btnSave_Click(object sender, EventArgs e)
            {
                saveFileDialog1.Filter = "JPEG图片(*.jpg)|*.jpg";
                if (saveFileDialog1.ShowDialog() == DialogResult.OK)
                {
                    webCame.grabImagePath = saveFileDialog1.FileName;
                    webCame.GrabImage();
                }
            }
        }
    }
    
    <html>
    <title>Powered by 饕餮 www.easyyh.com</title>
    <head>
    </head>
    <body>
    <div>
    <object id="yyzq" classid="clsid:412DE68D-3082-4C67-83FC-DBFBBFA9597B"
            width="523"
            height="323" >
    </object>
    </div>
    </body>
    </html>
    

    http://files.cnblogs.com/12taotie21/TestActiveX.rar

  • 相关阅读:
    服务器端渲染和客户端渲染
    混沌开窍---24幅由算法生成的正方形图像
    三生万物---算法生成的25幅三角形图像
    九尾之火---算法生成的动画图像
    最简单的分形图像生成算法
    正与邪---25幅由算法生成的五角星图像
    一幅画<十六芒星盾>---程序员or艺术家
    火火火---12幅算法生成火的图像
    恶魔的指纹---49幅由算法生成的七芒星图像
    混沌分形之电子云
  • 原文地址:https://www.cnblogs.com/12taotie21/p/3528606.html
Copyright © 2020-2023  润新知