2014/02/07

C#.Net 透過AVICap32擷取webcam畫面

本篇程式碼參考『[C#程式設計] 如何在C#中透過Windows API(AVICap32)截取WebCam畫面』文章


using System;
using System.Drawing;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {

        const int WM_CAP_DRIVER_CONNECT = 0x40a;
        const int WM_CAP_DRIVER_DISCONNECT = 0x40b;
        const int WM_CAP_EDIT_COPY = 0x41e;
        const int WS_CHILD = 0x40000000;
        const int WS_VISIBLE = 0x10000000;
        const int WM_CAP_GRAB_FRAME = 0x43c;

        [DllImport("avicap32")]
        static extern IntPtr capCreateCaptureWindowA(byte[] lpszWindowName, int dwStyle, int x, int y, int nWidth, int nHeight, IntPtr hWndParent, int nID);
        [DllImport("user32")]
        static extern int SendMessage(IntPtr hwnd, int wMsg, int wParam, [MarshalAs(UnmanagedType.AsAny)] object lParam);
        [DllImport("user32")]
        static extern bool DestroyWindow(IntPtr hwnd);

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            byte[] baDeviceName = new byte[1];

            //建立設備的Handle
            IntPtr intDeviceHandle = capCreateCaptureWindowA(baDeviceName, WS_VISIBLE | WS_CHILD, 0, 0, 0, 0, this.Handle, 0);
            SendMessage(intDeviceHandle, WM_CAP_DRIVER_CONNECT, 0, 0); //連接設備

            if (SendMessage(intDeviceHandle, WM_CAP_GRAB_FRAME, 0, 0) > 0) //如果有截取到畫面
            {
                if (SendMessage(intDeviceHandle, WM_CAP_EDIT_COPY, 0, 0) > 0) //如果有Copy到剪貼簿
                {
                    IDataObject MyClipboardObject = Clipboard.GetDataObject();//取得剪貼簿物件

                    if (MyClipboardObject.GetDataPresent(typeof(Bitmap))) //看看是不是點陣圖
                    {
                        Bitmap MyBitmap = (Bitmap)MyClipboardObject.GetData(typeof(Bitmap)); //取出點陣圖
                        pictureBox1.Image = MyBitmap;
                    }
                }
            }

            SendMessage(intDeviceHandle, WM_CAP_DRIVER_DISCONNECT, 0, 0); //設備連階斷開
        }
    }
}



肥肚子XD


參考資料:
http://itgroup.blueshop.com.tw/TimothyChi/blog?n=convew&i=10484
http://msdn.microsoft.com/en-us/library/windows/desktop/dd756879(v=vs.85).aspx