C# Ekran Görüntüsü Alma

Merhabalar, C# derslerimize kaldığımız yerden devam ediyoruz. Bu dersimizde ekran görüntüsü (ss) almayı anlatacağım. Hadi başlayalım !
Ekran görüntüsünü elbette form ekranında almayacağız, ekran görüntüsü almadan hemen önce formu gizleyecek ve ekran görüntüsü aldıktan sonra da geri göstereceğiz. Öncelikle ekran görüntüsü almak için 2 farklı yolumuz var, bu yazımda her ikisinden de bahsedeceğim. Birincisi grafik ve Bitmap nesneleri kullanacağız. Biliyorsunuz ki C#’ta resim ve grafiksel olaylar Bitmap üzerinden yürüyor, ki zaten Bitmap “bit haritası” gibi çevirebileceğimiz bir fotoğrafı veya resmi görüntülemek için gereken tüm renk bilgilerinin ve ekranı oluşturan piksel renk bilgilerinin verildiği resim formatlarına verilen genel ifadedir. İşte bizde grafik ve Bitmap kullanarak ekran görüntüsü alabiliriz. Yazının başlarında da dediğim gibi önce formu gizleyeceğiz ve bi süre bekledikten sonra (kullanıcı ekran görüntüsü almak istediği yeri açana kadar) Bitmap ve grafik nesneleri ile ekranı resim olarak kopyalayacağız, bu da ekran görüntüsü almamızı sağlayacak. Şimdi formu gizleyelim ve sonra Bitmap ve Graphics nesneleri oluşturalım;
Hide();
Thread.Sleep(5000);
Bitmap foto = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height);
Graphics gr = Graphics.FromImage(foto);
Hide() fonksiyonu ile formu gizledik ve Thread.Sleep() fonksiyonu ile formun çalıştığı threadı 5000 milisaniye yani 5 saniye beklettik, bu 5 saniye içerisinde programımız herhangi birşey yapmaz, sadece bekler. Ekranın hepsinden ekran görüntüsü almak istediğimiz için Bitmap nesnesini ekranın boyutu kadar ayarladık ve bu Bitmap’ı Graphics nesnesine yükledik. Şimdi de asıl işlemimiz olan ekran görüntüsü alma işlemini yapalım. Bunu da gr nesnesi içerisinde bulunan CopyFromScreen() fonksiyonunu kullanacağız. Bu fonksiyon kaynak konumun x noktası, kaynak konumun y noktası, hedef konumun x noktası, hedef konumun y noktası ve ekran görüntüsü alınacak boyut olmak üzere 5 parametre alıyor ve örnek kullanımı şöyle;
gr.CopyFromScreen(0, 0, 0, 0, new Size(foto.Width, foto.Height));
Baştaki 4 tane sıfır ile ekranın sol üst köşesinden yani ekranın başlangıç noktasından başlayıp foto nesnesinin boyutları kadar (ki foto nesnesi ekranın boyutları kadardı) genişlikte ekranı kopyaladık, yani ekran görüntüsü aldık.
E ekran görüntüsü aldık ama formumuz hâlâ gizli, hadi onu gösterelim ve örneğin form üzerine eklediğimiz pictureBox1 isimli PictureBox içinde gösterelim;
Show();
pictureBox1.Image = foto;
Hatırlarsanız foto nesnemiz ekranın boyutları kadardı ve onun üzerinden ekran görüntüsü almıştık, o yüzden PictureBox’ta foto nesnesini göstermemiz yeterli.
Evet birinci yolumuz böyleydi, buraya kadar olan kodları daha toplu olması için aşağıya bırakıyorum;
Hide();
Thread.Sleep(5000);
Bitmap foto = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height);
Graphics gr = Graphics.FromImage(foto);
gr.CopyFromScreen(0, 0, 0, 0, new Size(foto.Width, foto.Height));
Show();
pictureBox1.Image = foto;
Şimdi ikinci yolumuza geçelim. Bu yol biraz daha kısa aslında 🙂 Yine formu gizletecek, 5 saniye bekletecek ve daha sonra ekran görüntüsü alacağız. Tabi formu gizleme ve bekletmeyi anlattığım için tekrardan anlatmaya mahal yok. Biliyorsunuz ki klavyeden Print Screen tuşuna basarak ekran görüntüsü alabiliyoruz, e bizde Print Screen tuşuna bastırırsak ekran görüntüsü alabiliriz. Bunun yolu da SendKeys sınıfından geçiyor. Bu sınıf adından anlaşılacağı üzere tuş gönderme ve bastırma işlemleri yapıyor. Elbette klavyeden birebir tuşa basmıyor ama basılmış gibi yapıyor, daha doğrusu belirttiğimiz tuşu gönderiyor. Tuş gönderme işlemini de bu sınıf altında bulunan Send() fonksiyonu yapıyor ve bizde onu yapacağız. Bu fonksiyon ise string tipte tuşun adını istiyor ve Print Screen tuşunun Windows’taki karşılığı PRTSC olduğu için bu şekilde parametre göndereceğiz.
SendKeys.Send("{PRTSC}");
Eee ekran görüntüsü aldık fakat resmin ne olduğunu bilmiyoruz, bi yerde göremiyoruz. E Send() fonksiyonu void tipte olduğu için resmi bu fonksiyon üzerinden göremiyoruz. Peki nasıl resmi elde edeceğiz derseniz, Print Screen ile ekran görüntüsü aldığımızda alınan resim kopyalanmış oluyor yani Clipboard’a taşınıyor. E biz Clipboard’u yani kopyalanmış resmi okursak, ekran görüntüsüne de erişebiliriz. Peki kopyalanmış resmi nasıl öğreneceğiz derseniz de onu da System.Windows.Forms kütüphanesinde bulunan Clipboard sınıfının altındaki statik tipte olan yani bulunduğu sınıfın yeni bir nesnesi türetilmeden doğrudan erişilebilen GetImage() fonksiyonu ile yapacağız. Bu fonksiyon herhangi bir parametre istemiyor ve geriye Image nesnesi döndürüyor. Geri dönen bu Image nesnesini ister bi değişkene atayabilir yada direk PictureBox üzerinde gösterebiliriz. Örneğin az birinci yolda belirttiğimiz pictureBox üzerinde bu resmi gösterelim;
pictureBox1.Image = Clipboard.GetImage();
Evett, ikinci yolumuz da bu kadardı, burda da yazdığımız kodları aşağıya bırakıyorum;
Hide();
Thread.Sleep(5000);
SendKeys.Send("{PRTSC}");
Show();
pictureBox1.Image = Clipboard.GetImage();
Evet bu dersimizde bu kadardı, tüm C# derslerimize buraya tıklayarak ulaşabilirsiniz. Herkese hayırlı günler.