Ekran resmi yakalamak için aşağıdaki fonksiyonu yazdım, herhangi bir arayüzde kullanabilirsiniz. Monitör adeti kadar ekran resmi alınacaktır. Çözünürlük vb. farklı olması önemli değil, tüm aktif görüntüler yakalanacaktır. Ben aynı çözünürlükteki(1680*1050) iki monitörle test ettim. Aynı çözünürlüklerde hiçbir değişiklik olmadan ekranlar yakalanıyor. Aşağıda aldığım 3060*1050 çözünürlükteki test resmini büyüterek görebilirsiniz.

Monitör sayısı kadar ekran resmi yakalama-screenshot

Farklı çözünürlüklerde yakalanan resim, küçük olanın çözünürlüğü büyük olan kadar yatayda ve dikeyde boş alanlar eklenir. Buna hiç dokunmadım çünkü küçük çözünürlüğü büykla aynı yaparsanız, malum görüntü bozulacaktır. Benim ihityacım olmadığı için hiç denemedim duruma göre farklı görüntü işleme kütüphaneleri ile araştırıp bunun kararını verebilirsiniz.

ScreenShotHelper.cs

using System.ComponentModel;//This namespace is required for only Win32Exception. You can remove it if you are catching exceptions from another layer.
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;

namespace Company.Core.Helpers.Win32 {

    public static class ScreenShotHelper {

        private static Bitmap CopyFromScreen(Rectangle bounds) {
            try {
                var image = new Bitmap(bounds.Width, bounds.Height);
                using var graphics = Graphics.FromImage(image);
                graphics.CopyFromScreen(Point.Empty, Point.Empty, bounds.Size);
                return image;
            }
            catch(Win32Exception) {//When screen saver is active
                return null;
            }
        }

        public static Image Take(Rectangle bounds) {
            return CopyFromScreen(bounds);
        }

        public static byte[] TakeAsByteArray(Rectangle bounds) {
            using var image = CopyFromScreen(bounds);
            using var ms = new MemoryStream();
            image.Save(ms, ImageFormat.Png);
            return ms.ToArray();
        }   

        public static void TakeAsFile(string path, Rectangle bounds, ImageFormat imageFormat) {
            using var image = CopyFromScreen(bounds);
            image.Save(path, imageFormat);
        }
    }
}


ViewModel.cs-Binary Field

        var bounds = new Rectangle();
bounds = Screen.AllScreens.Aggregate(bounds, (current, screen) 
                           => Rectangle.Union(current, screen.Bounds));
_card.ScreenShot = Convert.ToBase64String(ScreenShotHelper.TakeAsByteArray(bounds));


ViewModel.cs-Disk File

var bounds = new Rectangle();
bounds = Screen.AllScreens.Aggregate(bounds, (current, screen) 
                           => Rectangle.Union(current, screen.Bounds));
ScreenShotHelper.TakeAndSave(@"d:\screenshot.png", bounds, ImageFormat.Png);           

  • Çözünürlükden bağımsız olarak her bir monitör görüntüsü yakalanır.
  • Farklı çözünürlüklerde boş kalan bölüm kadar resim uzatılır.
  • Veri tabanında binary alanlara ya da disk üzerinde dosya olarak kaydedilebilir.


Take screenshot of multiple desktops of all visible applications and forms