ByteScout Screen Capturing SDK - C# - Full Featured Capturing App - ByteScout
Announcement
Our ByteScout SDK products are sunsetting as we focus on expanding new solutions.
Learn More Open modal
Close modal
Announcement Important Update
ByteScout SDK Sunsetting Notice
Our ByteScout SDK products are sunsetting as we focus on our new & improved solutions. Thank you for being part of our journey, and we look forward to supporting you in this next chapter!

ByteScout Screen Capturing SDK – C# – Full Featured Capturing App

  • Home
  • /
  • Articles
  • /
  • ByteScout Screen Capturing SDK – C# – Full Featured Capturing App

ByteScout Screen Capturing SDK – C# – Full Featured Capturing App

CapturingThread.cs

using System;
using System.Drawing;
using System.IO;
using System.Runtime.InteropServices;
using System.Threading;
using System.Windows.Forms;
using BytescoutScreenCapturingLib;

// NOTE: if you are getting error like "invalid image" related to loading the SDK's dll then 
// try to do the following:
// 1) remove the reference to the SDK by View - Solution Explorer
// then click on References, select Bytescout... reference name and right-click it and select Remove
// 2) To re-add click on the menu: Project - Add Reference
// 3) In "Add Reference" dialog switch to "COM" tab and find Bytescout...
// 4) Select it and click "Add" 
// 5) Recompile the application 
// Note: if you need to run on both x64 and x86 then please make sure you have set "Embed Interop Types" to True for this reference

namespace ScreenCapturing
{
    public class CapturingThreadData
    {
        public CaptureAreaType CaptureType;
        public String TempFile;
        public Rectangle CaptureRectangle;
    	public bool ShowWebCamStream;

        public int Result = 0; // 0 - success; 1 - error
        public string ErrorText;
    }

    public class CapturingThread
    {
        public static void ThreadProc(Object obj)
        {
            Capturer capturer = new Capturer(); // create new screen capturer object

            CapturingThreadData data = (CapturingThreadData) obj;

	        if (Program.Cfg.WriteLog)
		        capturer.SetLogFile(Path.GetTempPath() + Application.ProductName + " log.txt");

	        capturer.RegistrationName = "demo";
            capturer.RegistrationKey = "demo";

			if (Program.Cfg.AudioDevice != "")
			{
				capturer.CurrentAudioDeviceName = Program.Cfg.AudioDevice;
			}

            if (Program.Cfg.AudioLine != "")
            {
                capturer.CurrentAudioDeviceLineName = Program.Cfg.AudioLine;
            }

			if (Program.Cfg.SelectedVideoCodecTab == 0)
			{
				capturer.CurrentWMVAudioCodecName = Program.Cfg.WmvAudioCodec;
				capturer.CurrentWMVAudioFormat = Program.Cfg.WmvAudioFormat;
				capturer.CurrentWMVVideoCodecName = Program.Cfg.WmvVideoCodec;

				Program.Cfg.WmvAudioCodec = capturer.CurrentWMVAudioCodecName;
				Program.Cfg.WmvAudioFormat = capturer.CurrentWMVAudioFormat;
				Program.Cfg.WmvVideoCodec = capturer.CurrentWMVVideoCodecName;
			}
			else
			{
				capturer.CurrentAudioCodecName = Program.Cfg.AviAudioCodec;
				capturer.CurrentVideoCodecName = Program.Cfg.AviVideoCodec;
			}

            capturer.AudioEnabled = Program.Cfg.EnableAudio;
            // this option tells to use captured area dimensions as output video width/height
            // or use user defined video dimensions
            capturer.MatchOutputSizeToTheSourceSize = !Program.Cfg.ResizeOutputVideo;
            capturer.FPS = Program.Cfg.FPS;
            
			capturer.ShowMouseHotSpot = Program.Cfg.ShowMouseHotSpot;
			capturer.CaptureMouseCursor = Program.Cfg.CaptureMouseCursor;
			capturer.AnimateMouseClicks = Program.Cfg.AnimateMouseClicks;
			capturer.AnimateMouseButtons = Program.Cfg.AnimateMouseButtons;
			capturer.MouseAnimationDuration = Program.Cfg.MouseAnimationDuration;
			capturer.MouseSpotRadius = Program.Cfg.MouseSpotRadius;
			capturer.MouseHotSpotColor = (uint) ColorTranslator.ToOle(Program.Cfg.MouseHotSpotColor);
			capturer.MouseCursorLeftClickAnimationColor = (uint) ColorTranslator.ToOle(Program.Cfg.MouseCursorLeftClickAnimationColor);
			capturer.MouseCursorRightClickAnimationColor = (uint) ColorTranslator.ToOle(Program.Cfg.MouseCursorRightClickAnimationColor);                 	

            capturer.CaptureRectLeft = data.CaptureRectangle.Left;
            capturer.CaptureRectTop = data.CaptureRectangle.Top;
            capturer.CaptureRectWidth = data.CaptureRectangle.Width;
            capturer.CaptureRectHeight = data.CaptureRectangle.Height;

            capturer.KeepAspectRatio = Program.Cfg.KeepAspectRatio;

            // show recording time stamp
            capturer.OverlayingRedTextCaption = "Recording: {RUNNINGMIN}:{RUNNINGSEC}:{RUNNINGMSEC} on {CURRENTYEAR}-{CURRENTMONTH}-{CURRENTDAY} at {CURRENTHOUR}:{CURRENTMIN}:{CURRENTSEC}:{CURRENTMSEC}";

            capturer.OutputWidth = Program.Cfg.OutputWidth;
            capturer.OutputHeight = Program.Cfg.OutputHeight;

            if ((capturer.WebCamCount > 0) && (data.ShowWebCamStream))
			{
				capturer.AddWebCamVideo = true;

				if (!String.IsNullOrEmpty(Program.Cfg.WebCameraDevice))
				{
					capturer.CurrentWebCamName = Program.Cfg.WebCameraDevice;
				}

				capturer.SetWebCamVideoRectangle(Program.Cfg.WebCameraWindowX, Program.Cfg.WebCameraWindowY, Program.Cfg.WebCameraWindowWidth, Program.Cfg.WebCameraWindowHeight);
			}
            
            data.TempFile = Path.GetTempFileName();
			data.TempFile = Path.ChangeExtension(data.TempFile, (Program.Cfg.SelectedVideoCodecTab == 0) ? ".wmv" : ".avi");
            capturer.OutputFileName = data.TempFile;
            capturer.CapturingType = data.CaptureType;

            // set border around captured area if we are not capturing entire screen
            if (capturer.CapturingType != CaptureAreaType.catScreen &&
                capturer.CapturingType != CaptureAreaType.catWebcamFullScreen)
            {
                // set border style
				capturer.CaptureAreaBorderType = Program.Cfg.CaptureAreaBorderType;
				capturer.CaptureAreaBorderColor = (uint) ColorTranslator.ToOle(Program.Cfg.CaptureAreaBorderColor);
				capturer.CaptureAreaBorderWidth = Program.Cfg.CaptureAreaBorderWidth;
            }


            try
            {
                capturer.Run();

	// IMPORTANT: if you want to check for some code if need to stop the recording then make sure you are 
	// using Thread.Sleep(1) inside the checking loop, so you have the loop like
	// Do 
	// Thread.Sleep(1) 
	// While StopButtonNotClicked

            }
            catch (COMException ex)
            {
                data.ErrorText = ex.Message;
                data.Result = 1;
                return;
            }

            try
            {
                Thread.Sleep(Timeout.Infinite);
            }
            catch (ThreadInterruptedException)
            {
                capturer.Stop();
                data.Result = 0;
            }
            catch (Exception ex)
            {
                data.ErrorText = ex.Message;
                data.Result = 1;
            }
        }
    }
}

ColorControl.cs

using System;
using System.Drawing;
using System.Windows.Forms;
using System.ComponentModel;

namespace ScreenCapturing
{
	public enum CustomBorderStyle { None, Dashed, Dotted, Bump, Etched, Flat, Raised, Sunken };

	public class ColorControl : Control
	{
		private CustomBorderStyle _borderStyle = CustomBorderStyle.None;
		
		private ToolTip _toolTip;
		private IContainer components;
		
		[DefaultValue(CustomBorderStyle.None)]
		public CustomBorderStyle BorderStyle
		{
			get { return _borderStyle; }
			set 
			{ 
				_borderStyle = value;
				Refresh();
			}
		}
		
		public ColorControl()
		{
			InitializeComponent();

			SetStyle(ControlStyles.AllPaintingInWmPaint, true);
			SetStyle(ControlStyles.UserPaint, true);
			SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
			UpdateStyles();

			AutoSize = false;
		}

		protected override void OnPaint(PaintEventArgs e)
		{
			base.OnPaint(e);

			e.Graphics.FillRectangle(new SolidBrush(ForeColor), ClientRectangle);

			if (BorderStyle == CustomBorderStyle.Dotted)
			{
				ControlPaint.DrawBorder(e.Graphics, ClientRectangle, SystemColors.ControlDarkDark, ButtonBorderStyle.Dotted);
			}
			else if (BorderStyle == CustomBorderStyle.Dashed)
			{
				ControlPaint.DrawBorder(e.Graphics, ClientRectangle, SystemColors.ControlDarkDark, ButtonBorderStyle.Dashed);
			}
			else if (BorderStyle != CustomBorderStyle.None)
			{
				Border3DStyle style;

				switch (BorderStyle)
				{
					case CustomBorderStyle.Bump: style = Border3DStyle.Bump; break;
					case CustomBorderStyle.Etched: style = Border3DStyle.Etched; break;
					case CustomBorderStyle.Raised: style = Border3DStyle.Raised; break;
					case CustomBorderStyle.Sunken: style = Border3DStyle.Sunken; break;
					default: style = Border3DStyle.Flat; break;
				}

				ControlPaint.DrawBorder3D(e.Graphics, ClientRectangle, style);
			}

			if (Focused)
			{
				Rectangle focusRect = new Rectangle(ClientRectangle.X + 2, ClientRectangle.Y + 2, ClientRectangle.Width - 4, ClientRectangle.Height - 4);
				ControlPaint.DrawFocusRectangle(e.Graphics, focusRect);
			}
		}

		protected override void OnGotFocus(EventArgs e)
		{
			base.OnGotFocus(e);

			Invalidate();
		}

		protected override void OnLostFocus(EventArgs e)
		{
			base.OnLostFocus(e);

			Invalidate();
		}

		protected override void OnMouseClick(MouseEventArgs e)
		{
			base.OnMouseClick(e);

			Focus();

			if (e.Button == MouseButtons.Left)
			{
				using (ColorDialog fd = new ColorDialog())
				{
					fd.AnyColor = true;
					fd.FullOpen = true;
					fd.Color = Color.FromArgb(255, ForeColor);

					int[] customColors = Program.Cfg.CustomColors;

					if (customColors != null && customColors.Length > 0)
					{
						fd.CustomColors = customColors;
					}

					if (fd.ShowDialog() == DialogResult.OK)
					{
						ForeColor = fd.Color;
						Program.Cfg.CustomColors = fd.CustomColors;
					}
				}
			}
			else if (e.Button == MouseButtons.Right)
			{
				ContextMenu menu = new ContextMenu();
				menu.MenuItems.Add(new MenuItem("Select Transparent Color", menu_Click));
				
				menu.Show(this, e.Location);
			}
		}

		void menu_Click(object sender, EventArgs e)
		{
			ForeColor = Color.Transparent;
		}

		protected override void OnKeyDown(KeyEventArgs e)
		{
			using (ColorDialog fd = new ColorDialog())
			{
				fd.AnyColor = true;
				fd.FullOpen = true;
				fd.Color = ForeColor;

				int[] customColors = Program.Cfg.CustomColors;

				if (customColors != null && customColors.Length > 0)
				{
					fd.CustomColors = customColors;
				}

				if (fd.ShowDialog() == DialogResult.OK)
				{
					ForeColor = fd.Color;
					Program.Cfg.CustomColors = fd.CustomColors;
				}
			}

			base.OnKeyDown(e);
		}

		protected override void OnForeColorChanged(EventArgs e)
		{
			String colorName = String.Empty, rgb, tooltip;
			
			if (ForeColor.ToKnownColor() != 0)
			{
				colorName = ForeColor.ToKnownColor().ToString();
			}
			else if (ForeColor.IsNamedColor)
			{
				colorName = ForeColor.ToString();
			}

			rgb = String.Format("R={0}; G={1}; B={2}", ForeColor.R, ForeColor.G, ForeColor.B);
			
			if (colorName.Length > 0)
			{
				tooltip = String.Format("{0} ({1})", colorName, rgb);
			}
			else
			{
				tooltip = rgb;
			}

			_toolTip.SetToolTip(this, tooltip);

			base.OnForeColorChanged(e);
		}

		private void InitializeComponent()
		{
			components = new Container();
			_toolTip = new ToolTip(components);
			SuspendLayout();
			// 
			// ColorControl
			// 
			_toolTip.SetToolTip(this, "Color");
			ResumeLayout(false);

		}
	}
}

Config.cs

using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;
using System.ComponentModel;
using System.Diagnostics;
using System.Globalization;
using Microsoft.Win32;
using BytescoutScreenCapturingLib;

// NOTE: if you are getting error like "invalid image" related to loading the SDK's dll then 
// try to do the following:
// 1) remove the reference to the SDK by View - Solution Explorer
// then click on References, select Bytescout... reference name and right-click it and select Remove
// 2) To re-add click on the menu: Project - Add Reference
// 3) In "Add Reference" dialog switch to "COM" tab and find Bytescout...
// 4) Select it and click "Add" 
// 5) Recompile the application 
// Note: if you need to run on both x64 and x86 then please make sure you have set "Embed Interop Types" to True for this reference


namespace ScreenCapturing
{
	public class Config
	{
		public int[] CustomColors { get { return Get<int&#91;&#93;>("CustomColors", null); } set { Options["CustomColors"] = value; } }
		public Point WindowLocation { get { return Get<Point>("WindowLocation", Point.Empty); } set { Options["WindowLocation"] = value; } }
		public string AudioDevice { get { return Get<string>("AudioDevice", ""); } set { Options["AudioDevice"] = value; } }
		public string AudioLine { get { return Get<string>("AudioLine", ""); } set { Options["AudioLine"] = value; } }
		public string AviAudioCodec { get { return Get<string>("AviAudioCodec", "PCM"); } set { Options["AviAudioCodec"] = value; } }
		public string AviVideoCodec { get { return Get<string>("AviVideoCodec", "Bytescout Lossless Video Codec"); } set { Options["AviVideoCodec"] = value; } }
		public string WmvAudioCodec { get { return Get<string>("WmvAudioCodec", "Windows Media Audio 9"); } set { Options["WmvAudioCodec"] = value; } }
		public int WmvAudioFormat { get { return Get<int>("WmvAudioFormat", 28); } set { Options["WmvAudioFormat"] = value; } } // 28 is 128 kbps audio format for WMV
		public string WmvVideoCodec { get { return Get<string>("WmvVideoCodec", "Windows Media Video 9"); } set { Options["WmvVideoCodec"] = value; } }
        public bool EnableAudio { get { return Get<bool>("EnableAudio", false); } set { Options["EnableAudio"] = value; } }
        public bool ResizeOutputVideo { get { return Get<bool>("ResizeOutputVideo", true); } set { Options["ResizeOutputVideo"] = value; } }
        public int OutputWidth { get { return Get<int>("OutputWidth", 640); } set { Options["OutputWidth"] = value; } }
        public int OutputHeight { get { return Get<int>("OutputHeight", 480); } set { Options["OutputHeight"] = value; } }
        public bool KeepAspectRatio { get { return Get<bool>("KeepAspectRatio", true); } set { Options["KeepAspectRatio"] = value; } }
        public float FPS { get { return Get<float>("FPS", 14.985f); } set { Options["FPS"] = value; } }
        public bool WriteLog { get { return Get<bool>("WriteLog", false); } set { Options["WriteLog"] = value; } }
        public bool DoNotShowMessage1 { get { return Get<bool>("DoNotShowMessage1", false); } set { Options["DoNotShowMessage1"] = value; } }
        public string LastUsedFolder { get { return Get<string>("LastUsedFolder", ""); } set { Options["LastUsedFolder"] = value; } }
		public int SelectedVideoCodecTab { get { return Get<int>("SelectedVideoCodecTab", 0); } set { Options["SelectedVideoCodecTab"] = value; } }
		public string WebCameraDevice { get { return Get<string>("WebCameraDevice", ""); } set { Options["WebCameraDevice"] = value; } }
		public int WebCameraWindowX { get { return Get<int>("WebCameraWindowX", 10); } set { Options["WebCameraWindowX"] = value; } }
		public int WebCameraWindowY { get { return Get<int>("WebCameraWindowY", 10); } set { Options["WebCameraWindowY"] = value; } }
		public int WebCameraWindowWidth { get { return Get<int>("WebCameraWindowWidth", 160); } set { Options["WebCameraWindowWidth"] = value; } }
		public int WebCameraWindowHeight { get { return Get<int>("WebCameraWindowHeight", 120); } set { Options["WebCameraWindowHeight"] = value; } }
		public bool ShowMouseHotSpot { get { return Get<bool>("ShowMouseHotSpot", true); } set { Options["ShowMouseHotSpot"] = value; } }
		public bool CaptureMouseCursor { get { return Get<bool>("CaptureMouseCursor", true); } set { Options["CaptureMouseCursor"] = value; } }
		public bool AnimateMouseClicks { get { return Get<bool>("AnimateMouseClicks", true); } set { Options["AnimateMouseClicks"] = value; } }
		public bool AnimateMouseButtons { get { return Get<bool>("AnimateMouseButtons", false); } set { Options["AnimateMouseButtons"] = value; } }
		public int MouseAnimationDuration { get { return Get<int>("MouseAnimationDuration", 600); } set { Options["MouseAnimationDuration"] = value; } }
		public int MouseSpotRadius { get { return Get<int>("MouseSpotRadius", 60); } set { Options["MouseSpotRadius"] = value; } }
		public Color MouseHotSpotColor { get { return Get<Color>("MouseHotSpotColor", Color.FromArgb(255, 255, 0)); } set { Options["MouseHotSpotColor"] = value; } }
		public Color MouseCursorLeftClickAnimationColor { get { return Get<Color>("MouseCursorLeftClickAnimationColor", Color.FromArgb(0, 0, 255)); } set { Options["MouseCursorLeftClickAnimationColor"] = value; } }
		public Color MouseCursorRightClickAnimationColor { get { return Get<Color>("MouseCursorRightClickAnimationColor", Color.FromArgb(0, 255, 0)); } set { Options["MouseCursorRightClickAnimationColor"] = value; } }
		public CaptureAreaBorderType CaptureAreaBorderType { get { return Get<CaptureAreaBorderType>("CaptureAreaBorderType", CaptureAreaBorderType.cabtSolid); } set { Options["CaptureAreaBorderType"] = value; } }
		public Color CaptureAreaBorderColor { get { return Get<Color>("CaptureAreaBorderColor", Color.Red); } set { Options["CaptureAreaBorderColor"] = value; } }
		public int CaptureAreaBorderWidth { get { return Get<int>("CaptureAreaBorderWidth", 2); } set { Options["CaptureAreaBorderWidth"] = value; } }

		private readonly String _strKey;
		public Dictionary<string, object> Options = new Dictionary<string, object>();
		public bool Subsection;
		
		public Config()
		{
			_strKey = Program.RegistryKey;
		}

		public Config(String section)
		{
			Debug.Assert(!String.IsNullOrEmpty(section));

			Subsection = true;
			_strKey = Program.RegistryKey + "\\" + section;
		}

		public T Get<T>(String optionName, Object defaultValue)
		{
			Debug.Assert(!String.IsNullOrEmpty(optionName));

		    object value;

			if (Options.TryGetValue(optionName, out value))
			{
				return (T) value;
			}
			else
			{
				String s = (String) Registry.GetValue("HKEY_CURRENT_USER\\" + _strKey, optionName, null);

				if (s == null)
				{
					return (T) defaultValue;
				}
				else
				{
					TypeConverter tc;

					if (typeof(T) == typeof(int[]))
					{
						tc = new IntegerArrayConverter();
					}
					else
					{
						tc = TypeDescriptor.GetConverter(typeof(T));
					}

					try
				    {
				        value = tc.ConvertFromString(s);
				    }
				    catch (Exception)
				    {
                        value = defaultValue;
				    }

					Options.Add(optionName, value);

					return (T) value;
				}
			}
		}

		public void Set(String optionName, Object value)
		{
			Debug.Assert(!String.IsNullOrEmpty(optionName));

			Options[optionName] = value;
		}

		public void Save()
		{
			RegistryKey key = Registry.CurrentUser.CreateSubKey(_strKey);

            if (key != null)
		    {
		        foreach (KeyValuePair<string, object> de in Options)
		        {
		            TypeConverter tc;
		            String s;

		            if (de.Value == null)
		            {
		                s = "";
		            }
		            else
		            {
		                if (de.Value is int[])
		                {
		                    tc = new IntegerArrayConverter();
		                }
		                else
		                {
		                    tc = TypeDescriptor.GetConverter(de.Value);
		                }

		                s = tc.ConvertToString(de.Value);
		            }

		            key.SetValue(de.Key, s);
		        }

		        key.Flush();
		    }
		}
	}

	public class IntegerArrayConverter : TypeConverter
	{
		public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
		{
			if (sourceType == typeof(string))
			{
				return true;
			}

			return base.CanConvertFrom(context, sourceType);
		}

		public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
		{
			if (value is string)
			{
				string[] ss = ((string) value).Split(new char[] { ';' });
				List<int> list = new List<int>();

				foreach (string s in ss)
				{
					if (!String.IsNullOrEmpty(s))
					{
						list.Add(Int32.Parse(s));
					}
				}

				return list.ToArray();
			}

			return base.ConvertFrom(context, culture, value);
		}

		public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType)
		{
			if (destinationType == typeof(string))
			{
				return true;
			}

			return base.CanConvertTo(context, destinationType);
		}

		public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType)
		{
			if (destinationType == typeof(string) && value is int[])
			{
				StringBuilder sb = new StringBuilder();

				foreach (int x in (int[]) value)
				{
					if (sb.Length > 0)
					{
						sb.Append(";");
					}

					sb.Append(x.ToString());
				}

				return sb.ToString();
			}

			return base.ConvertTo(context, culture, value, destinationType);
		}
	}
}

CustomMessageBox.cs

using System;
using System.Windows.Forms;

namespace ScreenCapturing
{
	public partial class CustomMessageBox : Form
	{
		public bool DoNotShow = false;

		public CustomMessageBox(string title, string text)
		{
			InitializeComponent();

			base.Text = title;
			label1.Text = text;
		}

		private void cbDoNotAsk_CheckedChanged(object sender, EventArgs e)
		{
			DoNotShow = cbDoNotShow.Checked;
		}
	}
}

MainForm.cs

using System;
using System.ComponentModel;
using System.Diagnostics;
using System.Drawing;
using System.IO;
using System.Runtime.InteropServices;
using System.Threading;
using System.Windows.Forms;
using ScreenCapturing.Properties;
using BytescoutScreenCapturingLib;


// NOTE: if you are getting error like "invalid image" related to loading the SDK's dll then 
// try to do the following:
// 1) remove the reference to the SDK by View - Solution Explorer
// then click on References, select Bytescout... reference name and right-click it and select Remove
// 2) To re-add click on the menu: Project - Add Reference
// 3) In "Add Reference" dialog switch to "COM" tab and find Bytescout...
// 4) Select it and click "Add" 
// 5) Recompile the application 
// Note: if you need to run on both x64 and x86 then please make sure you have set "Embed Interop Types" to True for this reference


namespace ScreenCapturing
{
	public sealed partial class MainForm : Form
	{
	    private bool _recording;
	    private ToolStripDropDown _dropDownItems;
        private Rectangle _recordingRegion = Rectangle.Empty;
	    private Thread _capturingThread;
	    private CapturingThreadData _capturingThreadData;
	    private string _lastRecordedFile;

        private const int MYKEYID = 0;
        private const int WM_HOTKEY = 0x0312;
	    private const int WM_MOUSEMOVE = 0x0200;
        private const int MOD_ALT = 1;
        private const int MOD_CONTROL = 2;
        private const int MOD_SHIFT = 4;

        [DllImport("user32.dll")]
        private static extern int RegisterHotKey(IntPtr hWnd, int id, int modifier, Keys vk);
        [DllImport("user32.dll")]
        private static extern bool UnregisterHotKey(IntPtr hWnd, int id);
        [DllImport("user32.dll")]
        private static extern bool SetForegroundWindow(IntPtr hWnd);

		public MainForm()
		{
			InitializeComponent();

			Point location = Program.Cfg.WindowLocation;

			if (location.IsEmpty)
			{
				StartPosition = FormStartPosition.CenterScreen;
			}
			else
			{
				Location = location;
			}

			Text = Application.ProductName + " " + Application.ProductVersion;
        }

		private void tsmiFullScreen_Click(object sender, EventArgs e)
        {
			_recordingRegion = Screen.PrimaryScreen.Bounds;
            
			StartRecording(CaptureAreaType.catScreen, sender == tsmiFullScreen);
        }

	    private void tsmiMouseRegion_Click(object sender, EventArgs e)
	    {
			_recordingRegion.Width = Program.Cfg.OutputWidth;
			_recordingRegion.Height = Program.Cfg.OutputHeight;

            StartRecording(CaptureAreaType.catMouse, sender == tsmiMouseRegion);
	    }

	    private void tsbRecord_Click(object sender, EventArgs e)
	    {
			if (_recording)
			{
				StopRecording();
			}
	    }

		private void tsbPlay_Click(object sender, EventArgs e)
	    {
            Process prc = new Process();
            prc.StartInfo.FileName = _lastRecordedFile;
			prc.StartInfo.UseShellExecute = true;

			try
			{
				prc.Start();
			}
			catch (Exception ex)
			{
				MessageBox.Show(ex.Message, Application.ProductName);
			}
	    }

	    private void tsbSettings_Click(object sender, EventArgs e)
        {
            using (SettingsForm f = new SettingsForm())
            {
            	f.ShowDialog();
            }
        }

	    private void StartRecording(CaptureAreaType captureType, bool withCam)
	    {
            _recording = true;

			if (withCam)
			{
				_dropDownItems = tsbRecordWithCam.DropDown;
				tsbRecord.Enabled = false;
				tsbRecordWithCam.ShowDropDownArrow = false;
				tsbRecordWithCam.DropDown = null;
				tsbRecordWithCam.Image = Resources.stop;
				tsbRecordWithCam.Text = "Stop";
			}
			else
			{
				_dropDownItems = tsbRecord.DropDown;
				tsbRecordWithCam.Enabled = false;
				tsbRecord.ShowDropDownArrow = false;
				tsbRecord.DropDown = null;
				tsbRecord.Image = Resources.stop;
				tsbRecord.Text = "Stop";
			}           

			statusBar.Items[0].Text = "Recording started";
			tsbPlay.Enabled = false;

	        if (!Program.Cfg.DoNotShowMessage1)
	        {
				CustomMessageBox mb = new CustomMessageBox(Application.ProductName, "Press CTRL-SHIFT-F12 to stop recording.");
                mb.StartPosition = FormStartPosition.CenterScreen;
	            mb.ShowDialog();
	            Program.Cfg.DoNotShowMessage1 = mb.DoNotShow;
	        }

            RegisterHotKey(Handle, MYKEYID, MOD_CONTROL + MOD_SHIFT, Keys.F12);

            _capturingThreadData = new CapturingThreadData();

            _capturingThreadData.CaptureType = captureType;
            _capturingThreadData.CaptureRectangle = _recordingRegion;
	    	_capturingThreadData.ShowWebCamStream = withCam;

            _capturingThread = new Thread(CapturingThread.ThreadProc);
            _capturingThread.Start(_capturingThreadData);

            WindowState = FormWindowState.Minimized;
	    }

        protected override void WndProc(ref Message m)
        {
            if (m.Msg == WM_HOTKEY && m.WParam.ToInt32() == MYKEYID)
            {
                if (_recording)
                {
                	StopRecording();
                }
            }

            base.WndProc(ref m);
        }

	    private void StopRecording()
		{
	    	Cursor = Cursors.WaitCursor;

	    	try
	    	{
	    		_capturingThread.Interrupt();
	    		_capturingThread.Join();
	    	}
	    	finally
	    	{
				Cursor = Cursors.Default;
	    	}

			_recording = false;

			if (!tsbRecord.Enabled)
			{
				tsbRecordWithCam.ShowDropDownArrow = true;
				tsbRecordWithCam.DropDown = _dropDownItems;
				tsbRecordWithCam.Image = Resources.record_cam;
				tsbRecordWithCam.Text = "Record with webcam";
				_dropDownItems = null;
				tsbRecord.Enabled = true;
			}
			else
			{
				tsbRecord.ShowDropDownArrow = true;
				tsbRecord.DropDown = _dropDownItems;
				tsbRecord.Image = Resources.record;
				tsbRecord.Text = "Record";
				_dropDownItems = null;
				tsbRecordWithCam.Enabled = true;
			}

            UnregisterHotKey(Handle, MYKEYID);
            WindowState = FormWindowState.Normal;
            SetForegroundWindow(Handle);

            if (_capturingThreadData.Result != 0)
            {
                statusBar.Items[0].Text = "Recording failed";
                MessageBox.Show("Capturing failed.\n\nError: " + _capturingThreadData.ErrorText);
            }
            else
            {
                SaveFileDialog dlg = new SaveFileDialog();

				if (Program.Cfg.SelectedVideoCodecTab == 0)
				{
					dlg.DefaultExt = "*.wmv";
					dlg.Filter = "WMV files (*.wmv)|*.wmv|All files (*.*)|*.*";
				}
				else
				{
					dlg.DefaultExt = "*.avi";
					dlg.Filter = "AVI files (*.avi)|*.avi|All files (*.*)|*.*";
				}

                dlg.FileName = "Screencast" + DateTime.Now.Year.ToString() + DateTime.Now.Month.ToString() + DateTime.Now.Day.ToString() + DateTime.Now.Hour.ToString() + DateTime.Now.Minute.ToString() + DateTime.Now.Second.ToString();
			    dlg.Title = "Save captured video as";
			    dlg.InitialDirectory = Program.Cfg.LastUsedFolder;

			    if (dlg.ShowDialog() == DialogResult.OK)
			    {
                    File.Copy(_capturingThreadData.TempFile, dlg.FileName, true);
			        
                    _lastRecordedFile = dlg.FileName;
                    statusBar.Items[0].Text = "Successfully recorded \"" + Path.GetFileName(dlg.FileName) + "\"";
                    tsbPlay.Enabled = File.Exists(_lastRecordedFile);
                    Program.Cfg.LastUsedFolder = Path.GetDirectoryName(dlg.FileName);

                    // open saved video file in the default media player
                    Process.Start(dlg.FileName);
                }
			    else
			    {
                    statusBar.Items[0].Text = "Canceled";
			    }

		        try
		        {
		            File.Delete(_capturingThreadData.TempFile);
		        }
		        catch
		        {
		        }
            }
		}

		protected override void OnLocationChanged(EventArgs e)
		{
			Program.Cfg.WindowLocation = Location;
			base.OnLocationChanged(e);
		}

		protected override void OnClosing(CancelEventArgs e)
		{
			if (_recording)
			{
				StopRecording();
			}

			Program.Cfg.Save();
			base.OnClosing(e);
		}

        private void tsmiRectangularRegion_Click(object sender, EventArgs e)
        {
            RegionSelector rs = new RegionSelector();
            
			if (rs.ShowDialog() != DialogResult.Abort)
            {
            	_recordingRegion = rs.SelectedRectangle;
				StartRecording(CaptureAreaType.catRegion, sender == tsmiRectangularRegion);
            }
        }
	}
}

MouseHook.cs

using System;
using System.Runtime.InteropServices;
using System.Reflection;
using System.ComponentModel;
using System.Windows.Forms;

namespace ScreenCapturing
{
    [StructLayout(LayoutKind.Sequential)]
    public struct POINT
    {
        public int X;
        public int Y;

        public POINT(int x, int y)
        {
            X = x;
            Y = y;
        }

        public static implicit operator System.Drawing.Point(POINT p)
        {
            return new System.Drawing.Point(p.X, p.Y);
        }

        public static implicit operator POINT(System.Drawing.Point p)
        {
            return new POINT(p.X, p.Y);
        }
    }

    public class MouseHook
    {
        private delegate int HookProc(int nCode, int wParam, IntPtr lParam);
        private static HookProc MouseHookProcedure;
        public event MouseEventHandler MouseActivity;
        private int hMouseHook = 0;

        private const int WM_LBUTTONDOWN = 0x201;
        private const int WM_RBUTTONDOWN = 0x204;
        private const int WM_MOUSEWHEEL = 0x020A;
        private const int WM_LBUTTONDBLCLK = 0x203;
        private const int WM_RBUTTONDBLCLK = 0x206;

        private const int WH_MOUSE = 7;
        private const int WH_MOUSE_LL = 14;

        [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall, SetLastError = true)]
        private static extern int SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hMod, int dwThreadId);
        
        [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
        private static extern int CallNextHookEx(int idHook, int nCode, int wParam, IntPtr lParam);

        [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall, SetLastError = true)]
        private static extern int UnhookWindowsHookEx(int idHook);

        [StructLayout(LayoutKind.Sequential)]
        private class MouseLLHookStruct
        {
            public POINT pt;
            public int mouseData;
            public int flags;
            public int time;
            public int dwExtraInfo;
        }

        [StructLayout(LayoutKind.Sequential)]
        private class MouseHookStruct
        {
            public POINT pt;
            public int  hwnd;
            public int wHitTestCode;
            public int dwExtraInfo;
        }

        public void SetHook()
        {
            MouseHookProcedure = new HookProc(MouseHookProc);
        	IntPtr modulehandle = Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()[0]);

            hMouseHook = SetWindowsHookEx(WH_MOUSE, MouseHookProcedure, modulehandle, 0);

            if (hMouseHook == 0)
            {
                int errorCode = Marshal.GetLastWin32Error();

                ReleaseHook(false);

                throw new Win32Exception(errorCode);
            }
        }

        public void ReleaseHook(bool throwExceptions)
        {
            if (hMouseHook != 0)
            {
                int retMouse = UnhookWindowsHookEx(hMouseHook);
                
                hMouseHook = 0;
                
                if (retMouse == 0 && throwExceptions)
                {
                    throw new Win32Exception(Marshal.GetLastWin32Error());
                }
            }
        }

        private int MouseHookProc(int nCode, int wParam, IntPtr lParam)
        {
            if ((nCode >= 0) && (MouseActivity != null))
            {
                MouseLLHookStruct mouseHookStruct = 
                    (MouseLLHookStruct) Marshal.PtrToStructure(lParam, typeof(MouseLLHookStruct));

                MouseButtons button = MouseButtons.None;
                short mouseDelta = 0;
                
                switch (wParam)
                {
                    case WM_LBUTTONDOWN:
                        button = MouseButtons.Left;
                        break;
                    case WM_RBUTTONDOWN:
                        button = MouseButtons.Right;
                        break;
                    case WM_MOUSEWHEEL:
                        mouseDelta = (short) ((mouseHookStruct.mouseData >> 16) & 0xffff);
                        break;
                }

                int clickCount = 0;
                
                if (button != MouseButtons.None)
                    if (wParam == WM_LBUTTONDBLCLK || wParam == WM_RBUTTONDBLCLK) clickCount = 2;
                    else clickCount = 1;

                MouseEventArgs e = new MouseEventArgs(button, clickCount, mouseHookStruct.pt.X, 
                    mouseHookStruct.pt.Y, mouseDelta);
                
                MouseActivity(this, e);
            }
            
            return CallNextHookEx(hMouseHook, nCode, wParam, lParam);
        }
    }
}

Program.cs

using System;
using System.Windows.Forms;

namespace ScreenCapturing
{
	static class Program
	{
		public static Config Cfg = null;

		public static string RegistryKey = "Software\\Screen Capturing";
		public static string PostCommand = String.Empty;

		[STAThread]
		static void Main()
		{
			Application.EnableVisualStyles();
			Application.SetCompatibleTextRenderingDefault(false);

			Cfg = new Config();

			MainForm mainForm = new MainForm();

			Application.Run(mainForm);
		}
	}
}

RegionSelector.cs

using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
using System.IO;
using System.Windows.Forms;

namespace ScreenCapturing
{
    public sealed class RegionSelector : Form
    {
        private Bitmap _bmpScreenshot;
        private Rectangle _selectedRectangle = Rectangle.Empty;
    	private bool _selecting = false;
		private readonly Cursor _cursor1;
		private readonly Cursor _cursor2;

        public RegionSelector()
        {
			_cursor1 = new Cursor(Path.Combine(Application.StartupPath, "cursor1.cur"));
			_cursor2 = new Cursor(Path.Combine(Application.StartupPath, "cursor2.cur"));

        	Cursor = _cursor1;

            SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint | ControlStyles.OptimizedDoubleBuffer, true);

            ControlBox = false;
            FormBorderStyle = FormBorderStyle.None;
            Name = "Region Selector";
            StartPosition = FormStartPosition.Manual;
            Location = new Point(0, 0);
            Size = SystemInformation.PrimaryMonitorSize;
            TopMost = true;

            _bmpScreenshot = new Bitmap(Screen.PrimaryScreen.Bounds.Width, 
                Screen.PrimaryScreen.Bounds.Height, PixelFormat.Format32bppArgb);
            
            using (Graphics g = Graphics.FromImage(_bmpScreenshot))
            {
                g.CopyFromScreen(Screen.PrimaryScreen.Bounds.X, Screen.PrimaryScreen.Bounds.Y, 0, 0, 
                    Screen.PrimaryScreen.Bounds.Size, CopyPixelOperation.SourceCopy);
            }
        }

        public Rectangle SelectedRectangle
        {
            get { return NormalizeRectangle(_selectedRectangle); }
            set { _selectedRectangle = value; }
        }

        protected override void OnPaint(PaintEventArgs e)
        {
            e.Graphics.DrawImage(_bmpScreenshot, new Rectangle(0, 0, _bmpScreenshot.Width, _bmpScreenshot.Height));

            Region region = new Region(new Rectangle(0, 0, _bmpScreenshot.Width, _bmpScreenshot.Height));
            Rectangle rectangle = SelectedRectangle;

            region.Exclude(rectangle);

            using (Brush brush = new SolidBrush(Color.FromArgb(174, Color.White)))
            {
                e.Graphics.FillRegion(brush, region);
            }

            if (!rectangle.IsEmpty)
            {
                using (Pen pen = new Pen(Color.Red, 1))
                {
                    pen.Alignment = PenAlignment.Outset;
                    e.Graphics.DrawRectangle(pen, rectangle);
                }
            }
        }

        public static Rectangle NormalizeRectangle(Rectangle r)
        {
            Rectangle result = r;

            if (result.Left > result.Right)
            {
                int width = result.Left - result.Right;
                result.X = result.Right;
                result.Width = System.Math.Abs(width);
            }
            
            if (result.Top > result.Bottom)
            {
                int height = result.Top - result.Bottom;
                result.Y = result.Bottom;
                result.Height = System.Math.Abs(height);
            }

            return result;
        }

        protected override void OnMouseMove(MouseEventArgs e)
        {
            if (_selecting)
            {
                _selectedRectangle.Width = e.X - _selectedRectangle.X;
                _selectedRectangle.Height = e.Y - _selectedRectangle.Y;

				Invalidate();
            }
        }

        protected override void OnMouseUp(MouseEventArgs e)
        {
			if (!_selecting)
			{
				_selecting = true;
				_selectedRectangle.Location = e.Location;
				Cursor = _cursor2;
			}
			else
			{
				_selecting = false;

				_selectedRectangle.Width = e.X - _selectedRectangle.X;
				_selectedRectangle.Height = e.Y - _selectedRectangle.Y;

				Close();
			}
        }

		protected override void OnKeyDown(KeyEventArgs e)
		{
			if (e.KeyCode == Keys.Escape)
			{
				DialogResult = DialogResult.Abort;
			}

			Close();
		}
    }
}

SettingsForm.cs

using System;
using System.Diagnostics;
using System.Globalization;
using System.IO;
using System.Windows.Forms;
using BytescoutScreenCapturingLib;

// NOTE: if you are getting error like “invalid image” related to loading the SDK’s dll then
// try to do the following:
// 1) remove the reference to the SDK by View – Solution Explorer
// then click on References, select Bytescout… reference name and right-click it and select Remove
// 2) To re-add click on the menu: Project – Add Reference
// 3) In “Add Reference” dialog switch to “COM” tab and find Bytescout…
// 4) Select it and click “Add”
// 5) Recompile the application
// Note: if you need to run on both x64 and x86 then please make sure you have set “Embed Interop Types” to True for this reference

namespace ScreenCapturing
{
public partial class SettingsForm : Form
{
private readonly Capturer _tempCapturer;

public SettingsForm()
{
InitializeComponent();

lblProductName.Text = Application.ProductName;
lblProductVersion.Text = “Version ” + Application.ProductVersion;

_tempCapturer = new Capturer();
_tempCapturer.RegistrationName = “demo”;
_tempCapturer.RegistrationKey = “demo”;

cmbFPS.Items.AddRange(new object[] { 5f, 7.5f, 10f, 12f, 14.985f, 15f, 19.98f, 20f, 23.976f, 24f, 25f, 29.97f, 30f, 50f, 59.94f, 60 });

for (int i = 0; i < _tempCapturer.AudioDeviceCount; i++) { string line = _tempCapturer.GetAudioDeviceName(i); cmbAudioDevices.Items.Add(line); } for (int i = 0; i < cmbAudioDevices.Items.Count; i++) { if (cmbAudioDevices.Items[i].ToString() == Program.Cfg.AudioDevice) { cmbAudioDevices.SelectedIndex = i; break; } } if (cmbAudioDevices.SelectedIndex == -1) { cmbAudioDevices.SelectedItem = _tempCapturer.CurrentAudioDeviceName; Program.Cfg.AudioDevice = _tempCapturer.CurrentAudioDeviceName; } for (int i = 0; i < _tempCapturer.AudioCodecsCount; i++) { string codec = _tempCapturer.GetAudioCodecName(i); cmbAviAudioCodecs.Items.Add(codec); } for (int i = 0; i < cmbAviAudioCodecs.Items.Count; i++) { if (cmbAviAudioCodecs.Items[i].ToString() == Program.Cfg.AviAudioCodec) { cmbAviAudioCodecs.SelectedIndex = i; break; } } if (cmbAviAudioCodecs.SelectedIndex == -1) { cmbAviAudioCodecs.SelectedItem = _tempCapturer.CurrentAudioCodecName; Program.Cfg.AviAudioCodec = _tempCapturer.CurrentAudioCodecName; } if (_tempCapturer.WebCamCount > 0)
{

for (int i = 0; i < _tempCapturer.WebCamCount; i++) { string camera = _tempCapturer.GetWebCamName(i); cmbWebCameras.Items.Add(camera); } for (int i = 0; i < cmbWebCameras.Items.Count; i++) { if (cmbWebCameras.Items[i].ToString() == Program.Cfg.WebCameraDevice) { cmbWebCameras.SelectedIndex = i; break; } } if (cmbWebCameras.SelectedIndex == -1 && cmbWebCameras.Items.Count > 0)
{
cmbWebCameras.SelectedIndex = _tempCapturer.CurrentWebCam;
Program.Cfg.WebCameraDevice = _tempCapturer.CurrentWebCamName;
}
}
else
{
cmbWebCameras.Enabled = false;
tbWebCameraHeight.Enabled = false;
tbWebCameraWidth.Enabled = false;
tbWebCameraX.Enabled = false;
tbWebCameraY.Enabled = false;
}

for (int i = 0; i < _tempCapturer.VideoCodecsCount; i++) { string codec = _tempCapturer.GetVideoCodecName(i); cmbAviVideoCodecs.Items.Add(codec); } for (int i = 0; i < cmbAviVideoCodecs.Items.Count; i++) { if (cmbAviVideoCodecs.Items[i].ToString() == Program.Cfg.AviVideoCodec) { cmbAviVideoCodecs.SelectedIndex = i; break; } } if (cmbAviVideoCodecs.SelectedIndex == -1) { cmbAviVideoCodecs.SelectedItem = _tempCapturer.CurrentVideoCodecName; Program.Cfg.AviVideoCodec = _tempCapturer.CurrentVideoCodecName; } for (int i = 0; i < _tempCapturer.WMVAudioCodecsCount; i++) { string codec = _tempCapturer.GetWMVAudioCodecName(i); cmbWmvAudioCodecs.Items.Add(codec); } for (int i = 0; i < cmbWmvAudioCodecs.Items.Count; i++) { if (cmbWmvAudioCodecs.Items[i].ToString() == Program.Cfg.WmvAudioCodec) { cmbWmvAudioCodecs.SelectedIndex = i; break; } } if (cmbWmvAudioCodecs.SelectedIndex == -1) { cmbWmvAudioCodecs.SelectedItem = _tempCapturer.CurrentWMVAudioCodecName; Program.Cfg.WmvAudioCodec = _tempCapturer.CurrentWMVAudioCodecName; } for (int i = 0; i < _tempCapturer.WMVVideoCodecsCount; i++) { string codec = _tempCapturer.GetWMVVideoCodecName(i); cmbWmvVideoCodecs.Items.Add(codec); } for (int i = 0; i < cmbWmvVideoCodecs.Items.Count; i++) { if (cmbWmvVideoCodecs.Items[i].ToString() == Program.Cfg.WmvVideoCodec) { cmbWmvVideoCodecs.SelectedIndex = i; break; } } if (cmbWmvVideoCodecs.SelectedIndex == -1) { cmbWmvVideoCodecs.SelectedItem = _tempCapturer.CurrentWMVVideoCodecName; Program.Cfg.WmvVideoCodec = _tempCapturer.CurrentWMVVideoCodecName; } cbEnableAudio.Checked = Program.Cfg.EnableAudio; cbResizeVideo.Checked = Program.Cfg.ResizeOutputVideo; tbWidth.Text = Program.Cfg.OutputWidth.ToString(); tbHeight.Text = Program.Cfg.OutputHeight.ToString(); cbKeepAspectRatio.Checked = Program.Cfg.KeepAspectRatio; cmbFPS.Text = Program.Cfg.FPS.ToString(); cbLog.Checked = Program.Cfg.WriteLog; tbWebCameraX.Text = Program.Cfg.WebCameraWindowX.ToString(); tbWebCameraY.Text = Program.Cfg.WebCameraWindowY.ToString(); tbWebCameraWidth.Text = Program.Cfg.WebCameraWindowWidth.ToString(); tbWebCameraHeight.Text = Program.Cfg.WebCameraWindowHeight.ToString(); cmbAudioLines.Enabled = cbEnableAudio.Checked; tbWidth.Enabled = cbResizeVideo.Checked; tbHeight.Enabled = cbResizeVideo.Checked; cbKeepAspectRatio.Enabled = cbResizeVideo.Checked; tabControl2.SelectedIndex = Program.Cfg.SelectedVideoCodecTab; cbCaptureMouseCursor.Checked = Program.Cfg.CaptureMouseCursor; cbShowMouseHotSpot.Checked = Program.Cfg.ShowMouseHotSpot; tbMouseAnimationDuration.Text = Program.Cfg.MouseAnimationDuration.ToString(CultureInfo.InvariantCulture); tbHotSpotRadius.Text = Program.Cfg.MouseSpotRadius.ToString(CultureInfo.InvariantCulture); ccMouseHotSpotColor.ForeColor = Program.Cfg.MouseHotSpotColor; cbAnimateMouseClicks.Checked = Program.Cfg.AnimateMouseClicks; cbAnimateMouseButtons.Checked = Program.Cfg.AnimateMouseButtons; ccMouseCursorLeftClickAnimationColor.ForeColor = Program.Cfg.MouseCursorLeftClickAnimationColor; ccMouseCursorRightClickAnimationColor.ForeColor = Program.Cfg.MouseCursorRightClickAnimationColor; cmbFrameType.Items.Add("None"); cmbFrameType.Items.Add("Solid"); cmbFrameType.Items.Add("Dashed"); cmbFrameType.Items.Add("Dotted"); cmbFrameType.SelectedIndex = (int) Program.Cfg.CaptureAreaBorderType; ccFrameColor.ForeColor = Program.Cfg.CaptureAreaBorderColor; tbFrameWidth.Text = Program.Cfg.CaptureAreaBorderWidth.ToString(CultureInfo.InvariantCulture); } private void cbEnableAudio_CheckedChanged(object sender, EventArgs e) { cmbAudioLines.Enabled = cbEnableAudio.Checked; } private void cbResizeVideo_CheckedChanged(object sender, EventArgs e) { tbWidth.Enabled = cbResizeVideo.Checked; tbHeight.Enabled = cbResizeVideo.Checked; cbKeepAspectRatio.Enabled = cbResizeVideo.Checked; } private void btnOk_Click(object sender, EventArgs e) { if (cmbWmvAudioFormats.SelectedIndex == -1) { MessageBox.Show("Please select WMV Audio Format", Application.ProductName); return; } try { Program.Cfg.SelectedVideoCodecTab = tabControl2.SelectedIndex; Program.Cfg.AudioDevice = cmbAudioDevices.SelectedItem.ToString(); if (cmbAudioLines.SelectedItem != null) { Program.Cfg.AudioLine = cmbAudioLines.SelectedItem.ToString(); } Program.Cfg.EnableAudio = cbEnableAudio.Checked; Program.Cfg.AviAudioCodec = cmbAviAudioCodecs.SelectedItem.ToString(); Program.Cfg.AviVideoCodec = cmbAviVideoCodecs.SelectedItem.ToString(); Program.Cfg.WmvAudioCodec = cmbWmvAudioCodecs.SelectedItem.ToString(); Program.Cfg.WmvAudioFormat = cmbWmvAudioFormats.SelectedIndex; Program.Cfg.WmvVideoCodec = cmbWmvVideoCodecs.SelectedItem.ToString(); Program.Cfg.ResizeOutputVideo = cbResizeVideo.Checked; Program.Cfg.OutputWidth = Int32.Parse(tbWidth.Text); Program.Cfg.OutputHeight = Int32.Parse(tbHeight.Text); Program.Cfg.KeepAspectRatio = cbKeepAspectRatio.Checked; Program.Cfg.FPS = float.Parse(cmbFPS.Text); Program.Cfg.WriteLog = cbLog.Checked; if (cmbWebCameras.Enabled) { Program.Cfg.WebCameraDevice = cmbWebCameras.SelectedItem.ToString(); Program.Cfg.WebCameraWindowX = Int32.Parse(tbWebCameraX.Text); Program.Cfg.WebCameraWindowY = Int32.Parse(tbWebCameraY.Text); Program.Cfg.WebCameraWindowWidth = Int32.Parse(tbWebCameraWidth.Text); Program.Cfg.WebCameraWindowHeight = Int32.Parse(tbWebCameraHeight.Text); } Program.Cfg.CaptureMouseCursor = cbCaptureMouseCursor.Checked; Program.Cfg.ShowMouseHotSpot = cbShowMouseHotSpot.Checked; Program.Cfg.MouseAnimationDuration = Convert.ToInt32(tbMouseAnimationDuration.Text); Program.Cfg.MouseSpotRadius = Convert.ToInt32(tbHotSpotRadius.Text); Program.Cfg.MouseHotSpotColor = ccMouseHotSpotColor.ForeColor; Program.Cfg.AnimateMouseClicks = cbAnimateMouseClicks.Checked; Program.Cfg.AnimateMouseButtons = cbAnimateMouseButtons.Checked; Program.Cfg.MouseCursorLeftClickAnimationColor = ccMouseCursorLeftClickAnimationColor.ForeColor; Program.Cfg.MouseCursorRightClickAnimationColor = ccMouseCursorRightClickAnimationColor.ForeColor; Program.Cfg.CaptureAreaBorderType = (CaptureAreaBorderType) cmbFrameType.SelectedIndex; Program.Cfg.CaptureAreaBorderColor = ccFrameColor.ForeColor; Program.Cfg.CaptureAreaBorderWidth = Int32.Parse(tbFrameWidth.Text); } catch (Exception exception) { MessageBox.Show(exception.Message, Application.ProductName); } } private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) { Process prc = new Process(); prc.StartInfo.FileName = "https://bytescout.com/"; prc.StartInfo.UseShellExecute = true; try { prc.Start(); } catch (Exception ex) { MessageBox.Show(ex.Message, Application.ProductName); } } private void btnVideoCodecProps_Click(object sender, EventArgs e) { Capturer tempCapturer = new Capturer(); tempCapturer.RegistrationName = "demo"; tempCapturer.RegistrationKey = "demo"; tempCapturer.CurrentVideoCodecName = cmbAviVideoCodecs.SelectedItem.ToString(); try { tempCapturer.ShowVideoCodecSettingsDialog(0); } catch (InvalidCastException) { MessageBox.Show("This codec has no properties dialog.", Application.ProductName); } catch (Exception exception) { MessageBox.Show("Failed to open the codec properties dialog.\n" + exception.Message, Application.ProductName); } } private void linkViewLog_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) { string logFile = Path.GetTempPath() + Application.ProductName + " log.txt"; if (File.Exists(logFile)) { Process prc = new Process(); prc.StartInfo.FileName = logFile; prc.StartInfo.UseShellExecute = true; try { prc.Start(); } catch (Exception ex) { MessageBox.Show(ex.Message, Application.ProductName); } } } private void cmbAudioDevices_SelectedIndexChanged(object sender, EventArgs e) { _tempCapturer.CurrentAudioDeviceName = cmbAudioDevices.SelectedItem.ToString(); cmbAudioLines.Items.Clear(); for (int i = 0; i < _tempCapturer.CurrentAudioDeviceLineCount; i++) { string line = _tempCapturer.GetCurrentAudioDeviceLineName(i); cmbAudioLines.Items.Add(line); } for (int i = 0; i < cmbAudioLines.Items.Count; i++) { if (cmbAudioLines.Items[i].ToString() == Program.Cfg.AudioLine) { cmbAudioLines.SelectedIndex = i; break; } } if (cmbAudioLines.SelectedIndex == -1) { for (int j = 0; j < cmbAudioLines.Items.Count; j++ ) { string tmpS = cmbAudioLines.Items[j].ToString().ToUpper(); if (tmpS.IndexOf("MIC") > -1)
{
cmbAudioLines.SelectedIndex = j;
}
}
}

if (cmbAudioLines.SelectedIndex == -1)
{
cmbAudioLines.SelectedItem = _tempCapturer.CurrentAudioDeviceLineName;
Program.Cfg.AudioLine = _tempCapturer.CurrentAudioDeviceLineName;
}
}

private void cmbWmvAudioCodecs_SelectedIndexChanged(object sender, EventArgs e)
{
_tempCapturer.CurrentWMVAudioCodecName = cmbWmvAudioCodecs.SelectedItem.ToString();

cmbWmvAudioFormats.Items.Clear();

// Get list of available WMV audio formats
for (int i = 0; i < _tempCapturer.WMVAudioFormatCount; i++) { string codec = _tempCapturer.GetWMVAudioFormatDescription(i); cmbWmvAudioFormats.Items.Add(codec); } for (int i = 0; i < cmbWmvAudioFormats.Items.Count; i++) { if (i == Program.Cfg.WmvAudioFormat) { cmbWmvAudioFormats.SelectedIndex = i; break; } } if (cmbWmvAudioFormats.SelectedIndex == -1) { cmbWmvAudioFormats.SelectedIndex = _tempCapturer.CurrentWMVAudioFormat; Program.Cfg.WmvAudioFormat = _tempCapturer.CurrentWMVAudioFormat; } } } } [/vb]

Tutorials:

prev
next