Click here to Skip to main content
15,892,965 members
Home / Discussions / C#
   

C#

 
GeneralRe: How to print (and preview) any document - but not with CrystalReport Pin
E_Gold21-Nov-09 8:41
E_Gold21-Nov-09 8:41 
GeneralRe: How to print (and preview) any document - but not with CrystalReport Pin
Luc Pattyn21-Nov-09 9:04
sitebuilderLuc Pattyn21-Nov-09 9:04 
AnswerRe: How to print (and preview) any document - but not with CrystalReport Pin
dojohansen23-Nov-09 9:35
dojohansen23-Nov-09 9:35 
Questionquick combobox question Pin
Ronni Marker21-Nov-09 5:36
Ronni Marker21-Nov-09 5:36 
AnswerMessage Closed Pin
21-Nov-09 5:45
stancrm21-Nov-09 5:45 
GeneralRe: quick combobox question Pin
Ronni Marker21-Nov-09 6:04
Ronni Marker21-Nov-09 6:04 
GeneralRe: quick combobox question Pin
PunkIsNotDead21-Nov-09 18:21
PunkIsNotDead21-Nov-09 18:21 
QuestionAPI explanation request [modified] Pin
mehrdad33321-Nov-09 0:15
mehrdad33321-Nov-09 0:15 
hi there
i am writing a program for video conference over internet i was looking for a sample for capturing a image from webcam i found that there is two way for doing this first is using WIA and second is using API i found a sample that use API (avicap32.dll) it work fine now i want to add another camera or webcam and the aouther is not accessible .i reviewed codes several times but i cant understand that. it is really complicated for me and as i cant understand the code i cant extend it for capturing image or video from any other devices synchronouslly here is the code and i would be really appriciated if you explan about the codes :
the class for capturing and sending image:
using System;
using System.Collections;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace WebCam_Capture
{
	/// <summary>
	/// Summary description for UserControl1.
	/// </summary>
	[System.Drawing.ToolboxBitmap(typeof(WebCamCapture), "CAMERA.ICO")] // toolbox bitmap
	[Designer("Sytem.Windows.Forms.Design.ParentControlDesigner,System.Design", typeof(System.ComponentModel.Design.IDesigner))] // make composite
	public class WebCamCapture : System.Windows.Forms.UserControl
	{
		private System.ComponentModel.IContainer components;
		private System.Windows.Forms.Timer timer1;

		// property variables
		private int m_TimeToCapture_milliseconds = 100;
		private int m_Width = 320;
		private int m_Height = 240;
		private int mCapHwnd;
		private ulong m_FrameNumber = 0;

		// global variables to make the video capture go faster
		private WebCam_Capture.WebcamEventArgs x = new WebCam_Capture.WebcamEventArgs();
		private IDataObject tempObj;
		private System.Drawing.Image tempImg;
		private bool bStopped = true;

		// event delegate
		public delegate void WebCamEventHandler (object source, WebCam_Capture.WebcamEventArgs e);
		// fired when a new image is captured
		public event WebCamEventHandler ImageCaptured; 

		#region API Declarations

		[DllImport("user32", EntryPoint="SendMessage")]
		public static extern int SendMessage(int hWnd, uint Msg, int wParam, int lParam);

		[DllImport("avicap32.dll", EntryPoint="capCreateCaptureWindowA")]
		public static extern int capCreateCaptureWindowA(string lpszWindowName, int dwStyle, int X, int Y, int nWidth, int nHeight, int hwndParent, int nID);

		[DllImport("user32", EntryPoint="OpenClipboard")]
		public static extern int OpenClipboard(int hWnd);

		[DllImport("user32", EntryPoint="EmptyClipboard")]
		public static extern int EmptyClipboard();

		[DllImport("user32", EntryPoint="CloseClipboard")]
		public static extern int CloseClipboard();

        [DllImport("avicap32.dll", EntryPoint = "capgetdeviiceproperties")]
        public static extern int capgetdeviiceproperties(string lpszWindowName, int dwStyle, int X, int Y, int nWidth, int nHeight, int hwndParent, int nID);


		#endregion

		#region API Constants

		public const int WM_USER = 1024;

		public const int WM_CAP_CONNECT = 1034;
		public const int WM_CAP_DISCONNECT = 1035;
		public const int WM_CAP_GET_FRAME = 1084;
		public const int WM_CAP_COPY = 1054;

		public const int WM_CAP_START = WM_USER;

		public const int WM_CAP_DLG_VIDEOFORMAT = WM_CAP_START + 41;
		public const int WM_CAP_DLG_VIDEOSOURCE = WM_CAP_START + 42;
		public const int WM_CAP_DLG_VIDEODISPLAY = WM_CAP_START + 43;
		public const int WM_CAP_GET_VIDEOFORMAT = WM_CAP_START + 44;
		public const int WM_CAP_SET_VIDEOFORMAT = WM_CAP_START + 45;
		public const int WM_CAP_DLG_VIDEOCOMPRESSION = WM_CAP_START + 46;
		public const int WM_CAP_SET_PREVIEW = WM_CAP_START + 50;

		#endregion

		#region NOTES

		/*
		 * If you want to allow the user to change the display size and 
		 * color format of the video capture, call:
		 * SendMessage (mCapHwnd, WM_CAP_DLG_VIDEOFORMAT, 0, 0);
		 * You will need to requery the capture device to get the new settings
		*/

		#endregion


		public WebCamCapture()
		{
			// This call is required by the Windows.Forms Form Designer.
			InitializeComponent();
		}

		/// <summary>
		/// Override the class's finalize method, so we can stop
		/// the video capture on exit
		/// </summary>
		~WebCamCapture()
		{
			this.Stop();
		}

		/// <summary>
		/// Clean up any resources being used.
		/// </summary>
		protected override void Dispose( bool disposing )
		{
			if( disposing )
			{

				if( components != null )
					components.Dispose();
			}
			base.Dispose( disposing );
		}

		#region Component Designer generated code
		/// <summary>
		/// Required method for Designer support - do not modify 
		/// the contents of this method with the code editor.
		/// </summary>
		private void InitializeComponent()
		{
			this.components = new System.ComponentModel.Container();
			this.timer1 = new System.Windows.Forms.Timer(this.components);
			// 
			// timer1
			// 
			this.timer1.Tick += new System.EventHandler(this.timer1_Tick);
			// 
			// WebCamCapture
			// 
			this.Name = "WebCamCapture";
			this.Size = new System.Drawing.Size(342, 252);

		}
		#endregion
     
        #region Control Properties

        /// <summary>
		/// The time intervale between frame captures
		/// </summary>
		public int TimeToCapture_milliseconds
		{
			get
			{ return m_TimeToCapture_milliseconds; }

			set
			{ m_TimeToCapture_milliseconds = value; }
		}

		/// <summary>
		/// The height of the video capture image
		/// </summary>
		public int CaptureHeight
		{
			get
			{ return m_Height; }
			
			set
			{ m_Height = value; }
		}

		/// <summary>
		/// The width of the video capture image
		/// </summary>
		public int CaptureWidth
		{
			get
			{ return m_Width; }

			set
			{ m_Width = value; }
		}

		/// <summary>
		/// The sequence number to start at for the frame number. OPTIONAL
		/// </summary>
		public ulong FrameNumber
		{
			get
			{ return m_FrameNumber; }

			set
			{ m_FrameNumber = value; }
		}

		#endregion

		#region Start and Stop Capture Functions

		/// <summary>
		/// Starts the video capture
		/// </summary>
		/// <param name="FrameNumber">the frame number to start at. 
		/// Set to 0 to let the control allocate the frame number</param>
		public void Start(ulong FrameNum)
		{
			try
			{
				// for safety, call stop, just in case we are already running
				this.Stop();

				// setup a capture window
				mCapHwnd = capCreateCaptureWindowA("WebCap", 0, 0, 0, m_Width, m_Height, this.Handle.ToInt32(), 0);

				// connect to the capture device
				Application.DoEvents();
				SendMessage(mCapHwnd, WM_CAP_CONNECT, 0, 0);
				SendMessage(mCapHwnd, WM_CAP_SET_PREVIEW, 0, 0);

				// set the frame number
				m_FrameNumber = FrameNum;

				// set the timer information
				this.timer1.Interval = m_TimeToCapture_milliseconds;
				bStopped = false;
				this.timer1.Start();
			}

			catch (Exception excep)
			{ 
				MessageBox.Show("An error ocurred while starting the video capture. Check that your webcamera is connected properly and turned on.\r\n\n" + excep.Message); 
				this.Stop();
			}
		}

		/// <summary>
		/// Stops the video capture
		/// </summary>
		public void Stop()
		{
			try
			{
				// stop the timer
				bStopped = true;
				this.timer1.Stop();

				// disconnect from the video source
				Application.DoEvents();
				SendMessage(mCapHwnd, WM_CAP_DISCONNECT, 0, 0);
			}

			catch (Exception excep)
			{ // don't raise an error here.
			}

		}

		#endregion

		#region Video Capture Code

		/// <summary>
		/// Capture the next frame from the video feed
		/// </summary>
		private void timer1_Tick(object sender, System.EventArgs e)
		{
			try
			{
				// pause the timer
				this.timer1.Stop();

				// get the next frame;
				SendMessage(mCapHwnd, WM_CAP_GET_FRAME, 0, 0);

				// copy the frame to the clipboard
				SendMessage(mCapHwnd, WM_CAP_COPY, 0, 0);

				// paste the frame into the event args image
				if (ImageCaptured != null)
				{
					// get from the clipboard
					tempObj = Clipboard.GetDataObject();
					tempImg = (System.Drawing.Bitmap) tempObj.GetData(System.Windows.Forms.DataFormats.Bitmap);

					/*
					* For some reason, the API is not resizing the video
					* feed to the width and height provided when the video
					* feed was started, so we must resize the image here
					*/
					x.WebCamImage = tempImg.GetThumbnailImage(m_Width, m_Height, null, System.IntPtr.Zero);

					// raise the event
					this.ImageCaptured(this, x);
				}		

				// restart the timer
				Application.DoEvents();
				if (! bStopped)
					this.timer1.Start();
              
			}

			catch (Exception excep)
			{ 
				MessageBox.Show("An error ocurred while capturing the video image. The video capture will now be terminated.\r\n\n" + excep.Message);
				this.Stop(); // stop the process
			}
		}

		#endregion
	}
}

thanks in advance

modified on Saturday, November 21, 2009 1:52 PM

AnswerRe: API explanation request Pin
Richard MacCutchan21-Nov-09 0:35
mveRichard MacCutchan21-Nov-09 0:35 
GeneralRe: API explanation request Pin
OriginalGriff21-Nov-09 0:40
mveOriginalGriff21-Nov-09 0:40 
GeneralRe: API explanation request Pin
#realJSOP21-Nov-09 1:00
mve#realJSOP21-Nov-09 1:00 
GeneralRe: API explanation request Pin
Richard MacCutchan21-Nov-09 6:23
mveRichard MacCutchan21-Nov-09 6:23 
GeneralRe: API explanation request Pin
mehrdad33321-Nov-09 8:03
mehrdad33321-Nov-09 8:03 
GeneralRe: API explanation request Pin
dojohansen23-Nov-09 9:41
dojohansen23-Nov-09 9:41 
GeneralRe: API explanation request Pin
Richard MacCutchan23-Nov-09 12:14
mveRichard MacCutchan23-Nov-09 12:14 
GeneralRe: API explanation request Pin
dojohansen23-Nov-09 23:29
dojohansen23-Nov-09 23:29 
GeneralRe: API explanation request Pin
Richard MacCutchan24-Nov-09 2:53
mveRichard MacCutchan24-Nov-09 2:53 
GeneralRe: API explanation request Pin
dojohansen23-Nov-09 23:33
dojohansen23-Nov-09 23:33 
AnswerRe: API explanation request Pin
#realJSOP21-Nov-09 1:06
mve#realJSOP21-Nov-09 1:06 
GeneralRe: API explanation request Pin
mehrdad33321-Nov-09 8:02
mehrdad33321-Nov-09 8:02 
AnswerRe: API explanation request Pin
#realJSOP22-Nov-09 1:09
mve#realJSOP22-Nov-09 1:09 
GeneralRe: API explanation request Pin
mehrdad33322-Nov-09 8:52
mehrdad33322-Nov-09 8:52 
GeneralRe: API explanation request Pin
dojohansen23-Nov-09 9:49
dojohansen23-Nov-09 9:49 
QuestionHelp required Regarding winpcap Pin
hunzabasharat20-Nov-09 20:27
hunzabasharat20-Nov-09 20:27 
QuestionPrinting a datagrid Pin
JollyMansArt20-Nov-09 16:59
JollyMansArt20-Nov-09 16:59 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.