Link Search Menu Expand Document

Record Screen from Command Line Console - C#

Screen Capturing SDK sample in C# demonstrating ‘Record Screen from Command Line Console’

Program.cs
using System;
using System.Collections.Generic;
using System.Text;
using System.Globalization;
using System.Threading;
using System.Runtime.InteropServices;
using System.Drawing;
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 CaptureScreenCSharp
{
    public class Win32Interop
    {
        [DllImport("crtdll.dll")]
        public static extern int _kbhit();
    }

    class Program
    {
        static void Main(string[] args)
        {
            Capturer capturer = new Capturer(); // create new screen capturer object


            if (args.Length < 1)
            {
                usage(capturer);
                return;
            }

            capturer.OutputFileName = args[0];
            capturer.CapturingType = CaptureAreaType.catRegion;
            setParams(args, capturer);

            // 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 = CaptureAreaBorderType.cabtDashed;
                capturer.CaptureAreaBorderColor = (uint)ColorTranslator.ToOle(Color.Red);
            }

	    // uncomment to enable recording of semitransparent or layered windows (Warning: may cause mouse cursor flickering)
	    // capturer.CaptureTransparentControls = true;

	    // WMV and WEBM output use WMVVideoBitrate property to control output video bitrate
   	    // so try to increase it by x2 or x3 times if you think the output video are you are getting is laggy
	    // capturer.WMVVideoBitrate = capturer.WMVVideoBitrate * 2;


            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);

                Console.WriteLine("Starting capture - Hit a key to stop ...");

                string s = capturer.CurrentVideoCodecName;
                Console.WriteLine(string.Format("Using video compressor - {0}", s));

                s = capturer.CurrentAudioCodecName;
                Console.WriteLine(string.Format("Using audio compressor - {0}", s));

                s = capturer.CurrentAudioDeviceLineName;
                Console.WriteLine(string.Format("Using audio input line - {0}", s));

                int i = 0;
                string spin = "|/-\\";
                while (Win32Interop._kbhit() == 0)
                {
                    Console.Write(string.Format("\rEncoding {0}", spin[i++]));
                    i %= 4;
                    Thread.Sleep(50);
                }

                capturer.Stop();

            // Release resources
            System.Runtime.InteropServices.Marshal.ReleaseComObject(capturer);
            capturer = null;

                Console.Write("\nDone");
                Console.Read();
            }
            catch (Exception)
            {
                Console.WriteLine(capturer.LastError);
            }
        }

        static void usage(Capturer capturer)
        {
            Console.WriteLine("Usage : CaptureScreenCSharp.exe <outfilename> [left] [top] [width] [height] [fps] [v-codec] [a-codec] [audioline]\n");
            Console.WriteLine("[left, top, width, height] is the rectangle to be captured");
            Console.WriteLine("[v-codec] is the index of the video codec in the list to use.");
            Console.WriteLine("[a-codec] is the index of the audio codec in the list to use.");
            Console.WriteLine("[audioline] is the index of the audio line in the list to capture from");
            Console.WriteLine("If either codec is unspecified, it defaults to 'Microsoft Video 1' and 'GSM 6.10'");
            Console.WriteLine("If audioline is unspecified, it uses the microphone");
            Console.WriteLine("To capture the currently playing output, select the stereo, mono or wave mix");
            
            Console.WriteLine("Installed Video Codecs (Note : Not all of them may work)");

            for (int i = 0; i < capturer.VideoCodecsCount; i++)
            {
                string name = capturer.GetVideoCodecName(i);
                Console.WriteLine(string.Format("    {0}. {1}", i, name));
            }

            Console.WriteLine("\nInstalled Audio Codecs (Note : Not all of them may work)");
            for (int i = 0; i < capturer.AudioCodecsCount; i++)
            {
                string name = capturer.GetAudioCodecName(i);
                Console.WriteLine(string.Format("    {0}. {1}", i, name));
            }

            Console.WriteLine("\nAudio input lines");
            for (int i = 0; i < capturer.CurrentAudioDeviceLineCount; i++)
            {
                string name = capturer.GetCurrentAudioDeviceLineName(i);
                Console.WriteLine(string.Format("    {0}. {1}", i, name));
            }
        }

        static void setParams(string[] args, Capturer capturer)
        {
            if (args.Length > 1)
            {
                int left = int.Parse(args[1]);
                capturer.CaptureRectLeft = left;
            }

            if (args.Length > 2)
            {
                int top = int.Parse(args[2]);
                capturer.CaptureRectTop = top;
            }

            if (args.Length > 3)
            {
                int width = int.Parse(args[3]);
                capturer.CaptureRectWidth = width;
            }

            if (args.Length > 5)
            {
                int height = int.Parse(args[5]);
                capturer.CaptureRectHeight = height;
            }

            if (args.Length > 6)
            {
                float fps = float.Parse(args[6], CultureInfo.InvariantCulture);
                capturer.FPS = fps;
            }

            if (args.Length > 7)
            {
                int vCodec = int.Parse(args[7]);
                capturer.CurrentVideoCodec = vCodec;
            }

            if (args.Length > 8)
            {
                int aCodec = int.Parse(args[8]);
                capturer.CurrentAudioCodec = aCodec;
            }

            if (args.Length > 9)
            {
                int aLine = int.Parse(args[9]);
                capturer.CurrentAudioDeviceLine = aLine;
            }
        }
    }
}

Download Source Code (.zip)

Return to the previous page Explore Screen Capturing SDK