Bir proje için ekran resmini tüm monitörlerde yakalamak için hiç bir bağımlılık olmadan windows yüklü bir makinede herhangi bir arayüzde çalışacak fonksiyonu ihtiyacım olmuştu belki bir başkasının da olabilir, Windows üzerinde çalışan masaüstü uygulamalarında kullanılabilir. 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.

Farklı çözünürlüklerde yakalanan resme, küçük olan çözünürlüğe büyük olan kadar yatayda ve dikeyde boş alanlar eklenir. Buna hiç dokunmadım çünkü küçük çözünürlüğü büyük olanla aynı yaparsanız, malum görüntü bozulacaktır. Benim ihtiyacım olmadığı için hiç denemedim duruma göre parametreleri değiştirerek farklı kullanabilirsiniz.
ScreenShotHelper.cs
using System;
using System.ComponentModel;//You can remove it if you will catch the below exception from another layer
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Runtime.InteropServices;
namespace Helpers {
public static class HelperScreenShot {
public static void TakeVirtualScreenAndSave(ImageFormat imageFormat, string fullFileName = null) {
var img = CopyFromScreen();
if(img == null) return;
if(string.IsNullOrWhiteSpace(fullFileName)) {
fullFileName = $"{Guid.NewGuid()}.{imageFormat.ToString().ToLower()}";
}
img.Save(fullFileName, imageFormat);
}
public static Image Take() {
return CopyFromScreen();
}
public static void TakeAndSave(string fullFileName, ImageFormat imageFormat) {
using var image = CopyFromScreen();
image?.Save(fullFileName, imageFormat);
}
public static byte[] TakeAsBinary(ImageFormat imageFormat) {
using var image = CopyFromScreen();
if(image == null) return default;
using var ms = new MemoryStream();
image.Save(ms, imageFormat);
return ms.ToArray();
}
private static Bitmap CopyFromScreen() {
try {
var size = HelperDisplay.GetVirtualScreenSize();
var image = new Bitmap(size.Width, size.Height);
using var graphics = Graphics.FromImage(image);
graphics.CopyFromScreen(Point.Empty, Point.Empty, size);
return image;
}
catch(Win32Exception) {//When screen saver is active
return null;
}
}
private static class HelperDisplay {
[DllImport("user32.dll")]
private static extern int GetSystemMetrics(MetricType metricType);
public static Size GetVirtualScreenSize() {
var width = GetSystemMetrics(MetricType.VirtualScreenWidth);
var height = GetSystemMetrics(MetricType.VirtualScreenHeight);
return new Size(width, height);
}
private enum MetricType {
VirtualScreenWidth = 78,
VirtualScreenHeight = 79
}
}
}
}
Kullanım örnekleri aşağıda.
var dir = Path.Combine("images", "screenshot");
var imgFormat = ImageFormat.Png;
var fileName = $"{Guid.NewGuid()}.{imgFormat.ToString().ToLower()}";
fileName = Path.Combine(dir, fileName);
if(!Directory.Exists(dir)) {
Directory.CreateDirectory(dir);
}
HelperScreenShot.TakeVirtualScreenAndSave(imgFormat, fileName);
//or
var binaryImg = HelperScreenShot.TakeAsBinary(imgFormat);
- Çö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.
Multiple Monitor System Metricswinuser.h headerHow do you use System.Drawing in .NET Core?Is there a method of screenshot for all virtual displays?


0 Yorum