WPF: Façon de faire des captures d'écran
Qui cherchent à modifier les suivantes pour prendre une capture d'écran large de tous les moniteurs. J'ai essayé de l'adapter, mais mes images sont vides. De l'écriture à l'essai.png est pour les tests. Le byte[]
sera envoyé à l'application réceptrice.
public byte[] Take()
{
int screenWidth = Convert.ToInt32(SystemParameters.VirtualScreenWidth);
int screenHeight = Convert.ToInt32(SystemParameters.VirtualScreenHeight);
int screenLeft = Convert.ToInt32(SystemParameters.VirtualScreenLeft);
int screenTop = Convert.ToInt32(SystemParameters.VirtualScreenTop);
RenderTargetBitmap renderTarget = new RenderTargetBitmap(screenWidth, screenHeight, 96, 96, PixelFormats.Pbgra32);
VisualBrush sourceBrush = new VisualBrush();
DrawingVisual drawingVisual = new DrawingVisual();
DrawingContext drawingContext = drawingVisual.RenderOpen();
using (drawingContext)
{
drawingContext.PushTransform(new ScaleTransform(1, 1));
drawingContext.DrawRectangle(sourceBrush, null, new Rect(new Point(0, 0), new Point(screenWidth, screenHeight)));
}
renderTarget.Render(drawingVisual);
PngBitmapEncoder pngEncoder = new PngBitmapEncoder();
pngEncoder.Frames.Add(BitmapFrame.Create(renderTarget));
Byte[] _imageArray;
using (MemoryStream outputStream = new MemoryStream())
{
pngEncoder.Save(outputStream);
_imageArray = outputStream.ToArray();
}
using (FileStream stream = new FileStream(@"c:\test.png", FileMode.Create, FileAccess.ReadWrite))
{
using (BinaryWriter writer = new BinaryWriter(stream))
{
writer.Write(_imageArray);
}
}
return _imageArray;
}
Vous devez vous connecter pour publier un commentaire.
D'abord, vous aurez besoin d'ajouter des références pour les espaces de noms suivants:
Puis énumérer vos moniteurs pour obtenir le rectangle de délimitation pour toutes les surfaces d'affichage et le passer dans la
Graphics.CopyFromScreen()
appel de la méthode:Garder à l'esprit que les moniteurs ne sont souvent pas parfaitement avec un simple rectangle, en particulier s'ils sont différents, la résolution, etc, de sorte que vous pourriez être mieux composant logiciel enfichable shotting les différents écrans. De toute façon, la solution à votre problème est de modifier les coordonnées que vous avez été en passant à la
Graphics.CopyFromScreen()
appel de méthode.EDIT: voir Demetris Leptos de commentaire ci-dessous, le code que j'ai posté dans cette réponse devrait être d'appeler DeleteObject sur le bitmap retourné par
screenBmp.GetHbitmap()
de manière à éviter les fuites de mémoire, comme spécifié dans la documentation MSDN.