views:

495

answers:

2

Hello all,

I would like to know if there is any way to capture a to capture a video (screencast) of my desktop with .NET? I am not looking for a screencast software, but simply a technique that would allow me to generate myself a video of my desktop.

I thought of taking multiple screenshots, but I am not sure of how I could generate programmatically a video with a sequence of images...

Does someone have an idea?

Thanks!

+1  A: 

Yeah, there are many ways to do this. This is a very simple method using WPF. It works, I've used it before.

http://www.sythe.org/showthread.php?t=175353

From the site:

Create a new WPF application, add a reference to System.Drawing.dll, and System.Windows.Forms.dll. Use the methods as you would expect, Stat, Stop, and Save.

Public Class ScreenRecorder

    Private Shared tempDir As String = My.Computer.FileSystem.SpecialDirectories.Temp & "\snapshot\"
    Private Shared snap As New System.Threading.Thread(AddressOf Snapshot)
    Private Shared _Bounds As System.Drawing.Rectangle = System.Windows.Forms.Screen.PrimaryScreen.Bounds
    Public Shared Property Bounds() As System.Drawing.Rectangle
        Get
            Return _Bounds
        End Get
        Set(ByVal value As System.Drawing.Rectangle)
            _Bounds = value
        End Set
    End Property
    Private Shared Sub Snapshot()
        If Not My.Computer.FileSystem.DirectoryExists(tempDir) Then _
            My.Computer.FileSystem.CreateDirectory(tempDir)
        Dim Co As Integer = 0
        Do
            Co += 1
            System.Threading.Thread.Sleep(50)
            Dim X As New System.Drawing.Bitmap(_Bounds.Width, _Bounds.Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb)
            Using G = System.Drawing.Graphics.FromImage(X)
                G.CopyFromScreen(_Bounds.Location, New System.Drawing.Point(), _Bounds.Size)
                Dim CurBounds As New System.Drawing.Rectangle(System.Windows.Forms.Cursor.Position - Bounds.Location, System.Windows.Forms.Cursor.Current.Size)
                Forms.Cursors.Default.Draw(G, CurBounds)
            End Using
            Dim FS As New IO.FileStream(tempDir & FormatString(Co.ToString, 5, "0"c) & ".png", IO.FileMode.OpenOrCreate)
            X.Save(FS, System.Drawing.Imaging.ImageFormat.Png)
            X.Dispose()
            FS.Close()
        Loop
    End Sub
    Public Shared Sub ClearRecording()
        If My.Computer.FileSystem.DirectoryExists(tempDir) Then _
        My.Computer.FileSystem.DeleteDirectory(tempDir, FileIO.DeleteDirectoryOption.DeleteAllContents)
        My.Computer.FileSystem.CreateDirectory(tempDir)
    End Sub
    Public Shared Sub Save(ByVal Output As String)
        Dim G As New Windows.Media.Imaging.GifBitmapEncoder

        Dim X As New List(Of IO.FileStream)
        For Each Fi As String In My.Computer.FileSystem.GetFiles(tempDir, FileIO.SearchOption.SearchTopLevelOnly, "*.png")
            Dim TempStream As New IO.FileStream(Fi, IO.FileMode.Open)
            Dim Frame = Imaging.BitmapFrame.Create(TempStream)
            X.Add(TempStream)
            G.Frames.Add(Frame)
        Next
        Dim FS As New IO.FileStream(Output, IO.FileMode.OpenOrCreate)
        G.Save(FS)
        FS.Close()

        For Each St As IO.FileStream In X
            St.Close()

        Next

    End Sub
    Public Shared Sub Start()
        snap = New System.Threading.Thread(AddressOf Snapshot)
        snap.Start()
    End Sub
    Public Shared Sub [Stop]()
        snap.Abort()
    End Sub
    Private Shared Function FormatString(ByVal S As String, ByVal places As Integer, ByVal character As Char) As String
        If S.Length >= places Then Return S
        For X As Integer = S.Length To places
            S = character & S
        Next
        Return S
    End Function

End Class


Here is another method using Managed DirectX

http://www.mdxinfo.com/resources/screencapture.php

Another resource:

http://www.codeproject.com/KB/audio-video/CaptureScreenAsVideo.aspx

BobbyShaftoe
I love this way! But it produces a gigantic GIF file...
Martin
Yep, it does but it does work.
BobbyShaftoe
It does... but the file is way to big for my need. Any idea how I could convert this GIF into a MPG, Silverlight, or something like that?
Martin
Ffmpeg may help you there.
Ryan Duffield
Yeah, you could always use another tool like FFmpeg to get it into another format.
BobbyShaftoe
Added another resource.
BobbyShaftoe
A: 

I believe I did something similar to this a while ago using the DirectShowNet library. It may help you.

Ryan Duffield