Aller au contenu

Capture d'écran en VB.NET : guide complet pour enregistrer la vidéo du bureau

L'enregistrement de l'écran du bureau dans les applications VB.NET (Visual Basic .NET) est essentiel pour créer des enregistreurs d'écran, des outils de tutoriels et des logiciels de surveillance. Que vous ayez besoin de capture plein écran, d'enregistrement par région ou de capture audio système, ce guide fournit des exemples Visual Basic étape par étape avec Video Capture SDK .Net.

Pourquoi utiliser Video Capture SDK .Net pour l'enregistrement d'écran en VB.NET

Video Capture SDK .Net offre une solution complète d'enregistrement d'écran pour les développeurs VB.NET :

  • Capture complète du bureau et enregistrement d'écran par région personnalisée
  • Prise en charge multi-écran avec énumération des moniteurs
  • Capture du curseur de la souris avec mise en évidence optionnelle des clics
  • Enregistrement audio système (microphone et loopback/son système)
  • Sortie MP4 avec encodage H.264/H.265 et accélération GPU
  • Aperçu d'écran en temps réel pendant l'enregistrement
  • Pattern async/await pour une capture non bloquante
  • Prise en charge de WinForms et WPF

Paquets NuGet requis

Ajoutez les paquets suivants à votre projet VB.NET :

<PackageReference Include="VisioForge.DotNet.VideoCapture" Version="2026.2.19" />
<PackageReference Include="VisioForge.CrossPlatform.Core.Windows.x64" Version="2025.11.0" />
<PackageReference Include="VisioForge.CrossPlatform.Libav.Windows.x64" Version="2025.11.0" />

Exemple complet d'enregistrement d'écran en VB.NET

L'exemple de capture d'écran suivant illustre une application WinForms qui enregistre le bureau avec audio et le sauvegarde dans un fichier MP4.

Initialisation du SDK et énumération des écrans

Initialisez le SDK et énumérez les écrans et périphériques audio disponibles au chargement du formulaire :

Imports System.IO
Imports VisioForge.Core
Imports VisioForge.Core.VideoCaptureX
Imports VisioForge.Core.Types.X.Sources
Imports VisioForge.Core.Types.X.Output
Imports VisioForge.Core.Types.X.AudioRenderers

Public Class Form1
    Private VideoCapture1 As VideoCaptureCoreX

    Private Async Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        ' Initialiser le SDK
        Await VisioForgeX.InitSDKAsync()

        ' Créer le moteur de capture vidéo avec VideoView pour l'aperçu
        VideoCapture1 = New VideoCaptureCoreX(VideoView1)
        AddHandler VideoCapture1.OnError, AddressOf VideoCapture1_OnError

        ' Énumérer les écrans disponibles
        For i As Integer = 0 To Screen.AllScreens.Length - 1
            Dim scr = Screen.AllScreens(i)
            cbDisplayIndex.Items.Add(
                $"{i}: {scr.DeviceName} ({scr.Bounds.Width}x{scr.Bounds.Height})")
        Next
        If cbDisplayIndex.Items.Count > 0 Then cbDisplayIndex.SelectedIndex = 0

        ' Énumérer les périphériques d'entrée audio (microphones)
        Dim audioSources = Await DeviceEnumerator.Shared.AudioSourcesAsync()
        For Each source In audioSources
            cbAudioInputDevice.Items.Add(source.DisplayName)
            If cbAudioInputDevice.Items.Count = 1 Then cbAudioInputDevice.SelectedIndex = 0
        Next

        ' Énumérer les périphériques audio loopback (son système)
        Dim audioOutputs = Await DeviceEnumerator.Shared.AudioOutputsAsync(
            AudioOutputDeviceAPI.WASAPI2)
        For Each audioOutput In audioOutputs
            cbAudioLoopbackDevice.Items.Add(audioOutput.Name)
            If cbAudioLoopbackDevice.Items.Count = 1 Then cbAudioLoopbackDevice.SelectedIndex = 0
        Next

        ' Définir le chemin de fichier de sortie par défaut
        edOutput.Text = Path.Combine(
            Environment.GetFolderPath(Environment.SpecialFolder.MyVideos),
            "screen_capture.mp4")
    End Sub

Capture plein écran vers MP4

Utilisez la classe ScreenCaptureD3D11SourceSettings pour capturer l'ensemble du bureau à une fréquence d'images spécifiée et le sauvegarder en MP4 :

    Private Async Sub btStartFullScreen_Click(
            sender As Object, e As EventArgs) Handles btStartFullScreen.Click
        Try
            ' Configurer la source de capture plein écran
            Dim screenSource As New ScreenCaptureD3D11SourceSettings() With {
                .MonitorIndex = cbDisplayIndex.SelectedIndex,
                .FrameRate = New VideoFrameRate(15, 1),
                .CaptureCursor = True
            }

            VideoCapture1.Video_Source = screenSource
            VideoCapture1.Video_Play = True

            ' Configurer la sortie MP4
            VideoCapture1.Outputs_Clear()
            VideoCapture1.Outputs_Add(New MP4Output(edOutput.Text), True)

            ' Démarrer la capture
            Await VideoCapture1.StartAsync()
        Catch ex As Exception
            MessageBox.Show(Me, ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
        End Try
    End Sub

Capture par région (zone personnalisée)

Capturez une zone rectangulaire spécifique de l'écran au lieu du bureau complet :

    Private Async Sub btStartRegion_Click(
            sender As Object, e As EventArgs) Handles btStartRegion.Click
        Try
            ' Configurer la capture par région avec rectangle personnalisé
            Dim screenSource As New ScreenCaptureD3D11SourceSettings() With {
                .Rectangle = New Rect(
                    CInt(edLeft.Text),
                    CInt(edTop.Text),
                    CInt(edRight.Text),
                    CInt(edBottom.Text)),
                .FrameRate = New VideoFrameRate(15, 1),
                .CaptureCursor = True
            }

            VideoCapture1.Video_Source = screenSource
            VideoCapture1.Video_Play = True

            ' Configurer la sortie MP4
            VideoCapture1.Outputs_Clear()
            VideoCapture1.Outputs_Add(New MP4Output(edOutput.Text), True)

            ' Démarrer la capture
            Await VideoCapture1.StartAsync()
        Catch ex As Exception
            MessageBox.Show(Me, ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
        End Try
    End Sub

Enregistrement avec audio système (microphone)

Ajoutez l'enregistrement audio du microphone à votre capture d'écran :

    ' Configurer la source audio du microphone
    Dim audioSources = Await DeviceEnumerator.Shared.AudioSourcesAsync()
    Dim audioDevice = audioSources.FirstOrDefault(
        Function(d) d.DisplayName = cbAudioInputDevice.Text)

    If audioDevice IsNot Nothing Then
        VideoCapture1.Audio_Source = audioDevice.CreateSourceSettingsVC(Nothing)
    End If

    VideoCapture1.Audio_Record = True

Enregistrement avec audio loopback (son système)

Capturez la sortie audio système (ce que vous entendez par les haut-parleurs) au lieu de l'entrée microphone :

    ' Configurer la source audio loopback (son système)
    Dim audioOutputs = Await DeviceEnumerator.Shared.AudioOutputsAsync(
        AudioOutputDeviceAPI.WASAPI2)
    Dim audioDevice = audioOutputs.FirstOrDefault(
        Function(d) d.Name = cbAudioLoopbackDevice.Text)

    If audioDevice IsNot Nothing Then
        VideoCapture1.Audio_Source = New LoopbackAudioCaptureDeviceSourceSettings(audioDevice)
    End If

    VideoCapture1.Audio_Record = True

Arrêter l'enregistrement

Arrêtez l'enregistrement d'écran et finalisez le fichier de sortie :

    Private Async Sub btStop_Click(sender As Object, e As EventArgs) Handles btStop.Click
        Try
            Await VideoCapture1.StopAsync()
        Catch ex As Exception
            MessageBox.Show(Me, ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
        End Try
    End Sub

Nettoyage à la fermeture du formulaire

Libérez correctement les ressources à la sortie de l'application :

    Private Async Sub Form1_FormClosing(
            sender As Object, e As FormClosingEventArgs) Handles MyBase.FormClosing

        If VideoCapture1 IsNot Nothing Then
            Await VideoCapture1.DisposeAsync()
            VideoCapture1 = Nothing
        End If

        VisioForgeX.DestroySDK()
    End Sub

    Private Sub VideoCapture1_OnError(sender As Object, e As ErrorsEventArgs)
        If Me.InvokeRequired Then
            Me.Invoke(Sub() mmLog.Text &= e.Message & Environment.NewLine)
        Else
            mmLog.Text &= e.Message & Environment.NewLine
        End If
    End Sub
End Class

Mode aperçu uniquement (sans enregistrement)

Pour prévisualiser le flux de capture du bureau sans sauvegarder dans un fichier, omettez l'ajout de la sortie :

' Configurer la source d'écran
Dim screenSource As New ScreenCaptureD3D11SourceSettings() With {
    .MonitorIndex = 0,
    .FrameRate = New VideoFrameRate(15, 1),
    .CaptureCursor = True
}

VideoCapture1.Video_Source = screenSource
VideoCapture1.Video_Play = True

' Aucune sortie ajoutée — aperçu uniquement
Await VideoCapture1.StartAsync()

Options de format de sortie

Bien que ce guide se concentre sur l'enregistrement MP4, vous pouvez sauvegarder votre capture d'écran dans d'autres formats :

Sortie WebM

WebM est idéal pour les enregistrements d'écran orientés web, offrant un encodage VP8/VP9 libre de droits avec des tailles de fichier réduites :

VideoCapture1.Outputs_Add(New WebMOutput(edOutput.Text), True)

Sortie AVI

AVI offre une compatibilité maximale avec les éditeurs vidéo hérités et les workflows basés sur Windows :

VideoCapture1.Outputs_Add(New AVIOutput(edOutput.Text), True)

Applications d'exemple

Des applications d'exemple VB.NET complètes sont disponibles :

Foire aux questions

Comment enregistrer simultanément microphone et audio système en capture d'écran VB.NET ?

VideoCaptureCoreX expose une seule Audio_Source, donc pour mélanger un microphone avec l'audio en loopback système, vous construisez un pipeline Media Blocks : un SystemAudioSourceBlock pour le microphone, une source loopback et un AudioMixerBlock qui les combine avant l'encodeur/le puits. La référence de traitement audio Media Blocks couvre la configuration AudioMixerBlock. Alternativement, sous Windows, basculez vers VideoCaptureCore (non-X) où Additional_Audio_CaptureDevice_MixChannels + la liste interne de périphériques supplémentaires gèrent directement le mélange.

Quelle fréquence d'images utiliser pour l'enregistrement d'écran en VB.NET ?

Utilisez 10–15 FPS pour l'enregistrement général du bureau (documents, présentations, navigation) et 25–30 FPS pour le contenu à fort mouvement comme la lecture vidéo ou les animations. Des fréquences d'images plus élevées augmentent l'utilisation CPU et la taille du fichier. Le code d'exemple de ce guide utilise New VideoFrameRate(15, 1) — changez le premier paramètre pour votre FPS souhaité. Pour l'encodage accéléré par GPU, associez les fréquences d'images plus élevées à MP4Output qui utilise l'encodage H.264 matériel lorsque disponible.

Puis-je enregistrer l'écran sans afficher d'aperçu en VB.NET ?

Oui. Créez VideoCaptureCoreX sans paramètre VideoView : VideoCapture1 = New VideoCaptureCoreX(). Définissez Video_Play = False pour ignorer le rendu, configurez la source d'écran et la sortie MP4 comme d'habitude, puis appelez Await VideoCapture1.StartAsync(). Cela réduit l'utilisation CPU car aucune image n'est rendue dans l'UI. Les applications console et services Windows peuvent utiliser cette approche pour l'enregistrement d'écran sans interface.

Comment gérer les écrans haute résolution (DPI) et mis à l'échelle en enregistrement d'écran VB.NET ?

ScreenCaptureD3D11SourceSettings capture la résolution native de l'écran indépendamment de la mise à l'échelle d'affichage Windows. Un moniteur 4K à 150 % de mise à l'échelle est toujours enregistré en 3840×2160 pixels. Si votre application WinForms VB.NET affiche des coordonnées incorrectes en capture par région, ajoutez <dpiAware>true</dpiAware> à votre fichier app.manifest ou appelez SetProcessDPIAware() au démarrage afin que Screen.AllScreens rapporte les dimensions en pixels physiques au lieu des valeurs mises à l'échelle.

Voir aussi