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[]>("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]