Form1.vb
Imports System.Diagnostics Imports System.IO Imports System.Runtime.InteropServices Imports System.Threading Imports System.Windows.Forms Imports 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 Public Partial Class Form1 Inherits Form Private capturer As Capturer = Nothing Private _recording As Boolean = False Private _paused As Boolean = False Public Sub New() InitializeComponent() ' Create Capturer instance capturer = New Capturer() capturer.RegistrationName = "demo" ' put your registration name here capturer.RegistrationKey = "demo" ' put your registration key here ' Get list of available audio devices For i As Integer = 0 To capturer.AudioDeviceCount - 1 Dim line As String = capturer.GetAudioDeviceName(i) cmbAudioDevices.Items.Add(line) Next ' Select current audio device If cmbAudioDevices.Items.Count > 0 Then cmbAudioDevices.SelectedIndex = capturer.CurrentAudioDevice End If ' Get list of available AVI audio codecs For i As Integer = 0 To capturer.AudioCodecsCount - 1 Dim codec As String = capturer.GetAudioCodecName(i) cmbAviAudioCodecs.Items.Add(codec) Next ' Select current AVI audio codec cmbAviAudioCodecs.SelectedIndex = capturer.CurrentAudioCodec ' Get list of available web camera devices For i As Integer = 0 To capturer.WebCamCount - 1 Dim camera As String = capturer.GetWebCamName(i) cmbWebCameras.Items.Add(camera) Next ' Select current web camera If cmbWebCameras.Items.Count <> 0 Then cmbWebCameras.SelectedIndex = capturer.CurrentWebCam Else cmbWebCameras.Items.Add("No devices") cmbWebCameras.SelectedIndex = 0 cmbWebCameras.Enabled = False cbShowWebCamOverlay.Enabled = False End If ' Get list of available AVI video codecs For i As Integer = 0 To capturer.VideoCodecsCount - 1 Dim codec As String = capturer.GetVideoCodecName(i) cmbAviVideoCodecs.Items.Add(codec) Next ' Select current AVI video codec cmbAviVideoCodecs.SelectedIndex = capturer.CurrentVideoCodec ' Get list of available WMV audio codecs For i As Integer = 0 To capturer.WMVAudioCodecsCount - 1 Dim codec As String = capturer.GetWMVAudioCodecName(i) cmbWmvAudioCodecs.Items.Add(codec) Next ' Select current WMV audio codec cmbWmvAudioCodecs.SelectedIndex = capturer.CurrentWMVAudioCodec ' Get list of available WMV video codecs For i As Integer = 0 To capturer.WMVVideoCodecsCount - 1 Dim codec As String = capturer.GetWMVVideoCodecName(i) cmbWmvVideoCodecs.Items.Add(codec) Next ' Select current WMV video codec cmbWmvVideoCodecs.SelectedIndex = capturer.CurrentWMVVideoCodec ' Fill list of FPS values 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}) ' Select current FPS cmbFPS.SelectedItem = 14.985F cbCaptureLayeredWindows.Checked = capturer.CaptureTransparentControls nudMouseHotSpot.Value = capturer.MouseSpotRadius End Sub ' Rectangular region recording mode is selected Private Sub cbEnableAudio_CheckedChanged(ByVal sender As Object, ByVal e As EventArgs) Handles cbEnableAudio.CheckedChanged cmbAudioDevices.Enabled = cbEnableAudio.Checked cmbAudioLines.Enabled = cbEnableAudio.Checked End Sub Private Sub cmbAudioDevices_SelectedIndexChanged(ByVal sender As Object, ByVal e As EventArgs) Handles cmbAudioDevices.SelectedIndexChanged If cmbAudioLines.Items.Count>0 capturer.CurrentAudioDeviceName = cmbAudioDevices.SelectedItem.ToString() End If cmbAudioLines.Items.Clear() ' Get list of available audio lines of current audio device For i As Integer = 0 To capturer.CurrentAudioDeviceLineCount - 1 Dim line As String = capturer.GetCurrentAudioDeviceLineName(i) cmbAudioLines.Items.Add(line) Next ' Select current audio line If cmbAudioLines.Items.Count > 0 Then cmbAudioLines.SelectedIndex = capturer.CurrentAudioDeviceLine End If End Sub Private Sub cmbWmvAudioCodecs_SelectedIndexChanged(ByVal sender As Object, ByVal e As EventArgs) Handles cmbWmvAudioCodecs.SelectedIndexChanged capturer.CurrentWMVAudioCodecName = cmbWmvAudioCodecs.SelectedItem.ToString() cmbWmvAudioFormats.Items.Clear() ' Get list of available WMV audio formats For i As Integer = 0 To capturer.WMVAudioFormatCount - 1 Dim codec As String = capturer.GetWMVAudioFormatDescription(i) cmbWmvAudioFormats.Items.Add(codec) Next ' Select current WMV audio format cmbWmvAudioFormats.SelectedIndex = capturer.CurrentWMVAudioFormat End Sub Private Sub rbRectRegion_CheckedChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles rbRectRegion.CheckedChanged tbX.Enabled = rbRectRegion.Checked tbY.Enabled = rbRectRegion.Checked tbWidth.Enabled = rbRectRegion.Checked OrElse rbRegionAroundMouse.Checked tbHeight.Enabled = rbRectRegion.Checked OrElse rbRegionAroundMouse.Checked End Sub ' Region around the mouse recording mode is selected Private Sub rbRegionAroundMouse_CheckedChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles rbRegionAroundMouse.CheckedChanged tbX.Enabled = rbRectRegion.Checked tbY.Enabled = rbRectRegion.Checked tbWidth.Enabled = rbRectRegion.Checked OrElse rbRegionAroundMouse.Checked tbHeight.Enabled = rbRectRegion.Checked OrElse rbRegionAroundMouse.Checked End Sub ' Full screen recording mode is selected Private Sub rbFullscreen_CheckedChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles rbFullscreen.CheckedChanged tbX.Enabled = rbRectRegion.Checked tbY.Enabled = rbRectRegion.Checked tbWidth.Enabled = rbRectRegion.Checked OrElse rbRegionAroundMouse.Checked tbHeight.Enabled = rbRectRegion.Checked OrElse rbRegionAroundMouse.Checked End Sub ' Show video code internal properties dialog Private Sub btnVideoCodecProps_Click(ByVal sender As Object, ByVal e As System.EventArgs) capturer.CurrentVideoCodec = cmbAviVideoCodecs.SelectedIndex capturer.ShowVideoCodecSettingsDialog(Handle.ToInt32()) End Sub ' Show log Private Sub linkViewLog_LinkClicked(ByVal sender As Object, ByVal e As LinkLabelLinkClickedEventArgs) Handles linkViewLog.LinkClicked Dim logFile As String = Path.GetTempPath() & "Capturing Log.txt" If File.Exists(logFile) Then Dim prc As New Process() prc.StartInfo.FileName = logFile prc.StartInfo.UseShellExecute = True Try prc.Start() Catch ex As Exception MessageBox.Show(ex.Message) End Try End If End Sub Private Sub btnStartRecording_Click(sender As Object, e As System.EventArgs) ' Set up the capturer If cbLog.Checked Then capturer.SetLogFile(Path.GetTempPath() & "Capturing Log.txt") End If Dim captureToAvi As Boolean = (tabControl1.SelectedIndex = 1) capturer.AudioEnabled = cbEnableAudio.Checked capturer.CurrentAudioDeviceName = cmbAudioDevices.SelectedItem.ToString() If cmbAudioLines.Items.Count > 0 Then capturer.CurrentAudioDeviceLineName = cmbAudioLines.SelectedItem.ToString() End If If captureToAvi Then capturer.CurrentAudioCodecName = cmbAviAudioCodecs.SelectedItem.ToString() capturer.CurrentVideoCodecName = cmbAviVideoCodecs.SelectedItem.ToString() Else ' capture to WMV capturer.CurrentWMVAudioCodecName = cmbWmvAudioCodecs.SelectedItem.ToString() capturer.CurrentWMVAudioFormat = cmbWmvAudioFormats.SelectedIndex capturer.CurrentWMVVideoCodecName = cmbWmvVideoCodecs.SelectedItem.ToString() End If capturer.MouseAnimationDuration = 400 capturer.FPS = Single.Parse(cmbFPS.Text) capturer.CaptureTransparentControls = cbCaptureLayeredWindows.Checked capturer.MouseSpotRadius = CInt(Math.Truncate(nudMouseHotSpot.Value)) capturer.CaptureRectLeft = Integer.Parse(tbX.Text) capturer.CaptureRectTop = Integer.Parse(tbY.Text) capturer.CaptureRectWidth = Integer.Parse(tbWidth.Text) capturer.CaptureRectHeight = Integer.Parse(tbHeight.Text) capturer.OutputWidth = Integer.Parse(tbWidth.Text) capturer.OutputHeight = Integer.Parse(tbHeight.Text) ' Set capturing mode If rbRectRegion.Checked Then capturer.CapturingType = CaptureAreaType.catRegion ' set border style capturer.CaptureAreaBorderType = CaptureAreaBorderType.cabtDashed ElseIf rbRegionAroundMouse.Checked Then capturer.CapturingType = CaptureAreaType.catMouse ' set border style capturer.CaptureAreaBorderType = CaptureAreaBorderType.cabtDashed Else capturer.CapturingType = CaptureAreaType.catScreen End If If cbShowWebCamOverlay.Checked Then ' Set web camera device to add overlaying video to the source capturer.AddWebCamVideo = True ' Set device name or you can set device by index using .CurrentCaptureDevice property capturer.CurrentWebCam = cmbWebCameras.SelectedIndex ' Set rectangle to show overlaying video from webcam into the rectangle 160x120 (starting with left point at 10,10) capturer.SetWebCamVideoRectangle(Integer.Parse(tbWebCameraX.Text), Integer.Parse(tbWebCameraY.Text), Integer.Parse(tbWebCameraWidth.Text), Integer.Parse(tbWebCameraHeight.Text)) End If ' Save to temp file Dim filename As String = Path.GetTempFileName() filename = Path.ChangeExtension(filename, CType(IIf(captureToAvi, "avi", "wmv"), String)) capturer.OutputFileName = filename Try ' Start capturing Try Cursor = Cursors.WaitCursor 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 ' 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 Finally Cursor = Cursors.Default End Try _recording = True btnStartRecording.Enabled = False btnPauseRecording.Enabled = True btnStopRecording.Enabled = True ' Wait for "Stop Recording" button pressed While _recording Thread.Sleep(10) Application.DoEvents() End While ' Stop capturing Try Cursor = Cursors.WaitCursor capturer.Stop() Finally Cursor = Cursors.Default End Try ' Ask for output file name Dim dlg As New SaveFileDialog() dlg.Title = "Save captured video as" dlg.FileName = "Screencast" If captureToAvi Then dlg.DefaultExt = "*.avi" dlg.Filter = "AVI files (*.avi)|*.avi|All files (*.*)|*.*" Else dlg.DefaultExt = "*.wmv" dlg.Filter = "WMV files (*.wmv)|*.wmv|All files (*.*)|*.*" End If If dlg.ShowDialog() = DialogResult.OK Then ' Save to specified file name File.Copy(capturer.OutputFileName, dlg.FileName, True) End If ' clean up Try File.Delete(capturer.OutputFileName) Catch End Try btnStartRecording.Enabled = True btnPauseRecording.Enabled = False btnStopRecording.Enabled = False ' open saved video in default video viewer Try Process.Start(dlg.FileName) Catch End Try Catch ex As COMException MessageBox.Show(ex.Message) End Try End Sub Private Sub btnPauseRecording_Click(sender As Object, e As EventArgs) Dim captureToAvi As Boolean = (tabControl1.SelectedIndex = 1) If captureToAvi Then MessageBox.Show("Pausing is only available for WMV format yet.") Return End If If Not _paused Then capturer.Pause() _paused = True btnPauseRecording.Text = "Resume recodring" Else ' Resume capturing capturer.Run() _paused = False btnPauseRecording.Text = "Pause recording" End If End Sub Private Sub btnStopRecording_Click(sender As Object, e As System.EventArgs) ' Toggle recording flag If _recording Then _recording = False End If End Sub End Class
Program.vb
Imports System.Collections.Generic Imports System.Windows.Forms NotInheritable Class Program Private Sub New() End Sub ''' <summary> ''' The main entry point for the application. ''' </summary> <STAThread> _ Friend Shared Sub Main() Application.EnableVisualStyles() Application.SetCompatibleTextRenderingDefault(False) Application.Run(New Form1()) End Sub End Class