IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

[SharpDX] Capture Screenshot FullScreen


Sujet :

C#

  1. #1
    Nouveau membre du Club Avatar de xlkiller
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Août 2007
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Août 2007
    Messages : 41
    Points : 35
    Points
    35
    Par défaut [SharpDX] Capture Screenshot FullScreen
    Salut la communauté,

    Alors avant toute chose je précise que je débute en C#

    J'essaye de réaliser une application faisant des captures d'écran de jeu DirectX en plein écran.
    J'ai réussi en utilisant la librairie SharpDX et cela fonctionne parfaitement.

    Mon problème est le suivant:
    J'aimerais pourvoir faire une capture quand le jeu est réduit (minimisé), hors dans mon cas bien sûr quand le jeu est réduit ben je capture ce qu'affiche la carte graphique ...

    Voici mon code actuel:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    private static void SCREEN()
            {
                // Create DXGI Factory1
                var factory = new Factory1();
                var adapter = factory.GetAdapter1(numAdapter);
     
                // Create device from Adapter
                var device = new Device(adapter);
     
                // Get DXGI.Output
                var output = adapter.GetOutput(numOutput);
                var output1 = output.QueryInterface<Output1>();
     
                // Width/Height of desktop to capture
                int width = ((SharpDX.Rectangle)output.Description.DesktopBounds).Width;
                int height = ((SharpDX.Rectangle)output.Description.DesktopBounds).Height;
     
                // Create Staging texture CPU-accessible
                var textureDesc = new Texture2DDescription
                {
                    CpuAccessFlags = CpuAccessFlags.Read,
                    BindFlags = BindFlags.None,
                    Format = Format.B8G8R8A8_UNorm,
                    Width = width,
                    Height = height,
                    OptionFlags = ResourceOptionFlags.None,
                    MipLevels = 1,
                    ArraySize = 1,
                    SampleDescription = { Count = 1, Quality = 0 },
                    Usage = ResourceUsage.Staging
                };
     
                var screenTexture = new Texture2D(device, textureDesc);
     
                // Duplicate the output
                var duplicatedOutput = output1.DuplicateOutput(device);
     
                bool captureDone = false;
                for (int i = 0; !captureDone; i++)
                {
                    try
                    {
                        SharpDX.DXGI.Resource screenResource;
                        OutputDuplicateFrameInformation duplicateFrameInformation;
     
                        // Try to get duplicated frame within given time
                        duplicatedOutput.AcquireNextFrame(10000, out duplicateFrameInformation, out screenResource);
     
                        if (i > 0)
                        {
                            // copy resource into memory that can be accessed by the CPU
                            using (var screenTexture2D = screenResource.QueryInterface<Texture2D>())
                                device.ImmediateContext.CopyResource(screenTexture2D, screenTexture);
     
                            // Get the desktop capture texture
                            var mapSource = device.ImmediateContext.MapSubresource(screenTexture, 0, MapMode.Read, MapFlags.None);
     
                            // Create Drawing.Bitmap
                            var bitmap = new Bitmap(width, height, PixelFormat.Format32bppRgb);
                            var boundsRect = new System.Drawing.Rectangle(0, 0, width, height);
     
                            // Copy pixels from screen capture Texture to GDI bitmap
                            var mapDest = bitmap.LockBits(boundsRect, ImageLockMode.WriteOnly, bitmap.PixelFormat);
                            var sourcePtr = mapSource.DataPointer;
                            var destPtr = mapDest.Scan0;
                            for (int y = 0; y < height; y++)
                            {
                                // Copy a single line 
                                Utilities.CopyMemory(destPtr, sourcePtr, width * 4);
     
                                // Advance pointers
                                sourcePtr = IntPtr.Add(sourcePtr, mapSource.RowPitch);
                                destPtr = IntPtr.Add(destPtr, mapDest.Stride);
                            }
     
                            // Release source and dest locks
                            bitmap.UnlockBits(mapDest);
                            device.ImmediateContext.UnmapSubresource(screenTexture, 0);
     
                            // Save the output
                            bitmap.Save("Screenshot.bmp", ImageFormat.Bmp);
     
                            // Capture done
                            captureDone = true;
     
                        screenResource.Dispose();
                        duplicatedOutput.ReleaseFrame();
                    }
                    catch (SharpDXException error)
                    {
                        if (error.ResultCode.Code != SharpDX.DXGI.ResultCode.WaitTimeout.Result.Code)
                        {
                            throw error;
                        }
                    }
                }
     
                factory.Dispose();
                adapter.Dispose();
                device.Dispose();
                output.Dispose();
                output1.Dispose();
                screenTexture.Dispose();
                duplicatedOutput.Dispose();
            }
    Est-il possible de modifier "l'adapter" pour que ça ne capture que le Process ? (débutant qui parle)

    Merci de votre aide.

  2. #2
    Expert confirmé
    Avatar de wallace1
    Homme Profil pro
    Administrateur systèmes
    Inscrit en
    Octobre 2008
    Messages
    1 966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Administrateur systèmes
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 966
    Points : 4 005
    Points
    4 005
    Billets dans le blog
    7

  3. #3
    Nouveau membre du Club Avatar de xlkiller
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Août 2007
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Août 2007
    Messages : 41
    Points : 35
    Points
    35
    Par défaut
    Non cela ne fonctionne pas pour un jeu, cela renvoi une image noir, en plus les jeu sont en plein écran, il n'y a pas de fenêtre. Sinon merci quand même pour le partage.

Discussions similaires

  1. Capture vidéo fullscreen
    Par Deomys dans le forum SFML
    Réponses: 1
    Dernier message: 07/11/2014, 13h52
  2. [À télécharger] Faire une simple capture d'écran (screenshot)
    Par SfJ5Rpw8 dans le forum Vos téléchargements VB6
    Réponses: 0
    Dernier message: 14/11/2010, 17h53
  3. Comment faire un screenshot/capture d'ecran ?
    Par Couz02 dans le forum C++
    Réponses: 15
    Dernier message: 03/05/2008, 20h49
  4. Réponses: 3
    Dernier message: 01/11/2002, 14h30
  5. OPENGL Couleurs Fullscreen
    Par Boublou dans le forum OpenGL
    Réponses: 2
    Dernier message: 28/09/2002, 13h00

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo