C# ile Print Screen Almak

MertkanElpeze

Asistan
Katılım
6 Ekim 2010
Mesajlar
151
Reaksiyon puanı
4
Puanları
18
Kaynak : http://wp.me/p1dKsd-4v

Bugün basit bir uygulama yazmam gerekti. Senaryo şuydu ; kullanıcının bazı yerlerden print screen alması gerekiyor ve normal şartlarda Alt+PrintScreen tuşuna basıp paint dosyasına Ctrl+V dediğimizde hallolan bu işlemi daha az uğraş gerektirerek nasıl yapabiliriz onu düşündük. C#’ta basit bir application yazmaya karar verdik.


Normalde bir uygulama yapmadan bu işlemi 5 adımda yapıyoruz ;

1-Sayfaya alt+printscreen
2-Paint dosyası aç
3-Painte yapıştır.
4- Paintten kaydet
5- İstediğin klasöre kopyala

Yazdığımız minik uygulama ile;

1-Resmini çekmek istediğin alanı seç
2-Kaydete bas.

Şimdi bazılarınız diyebilir ki paintle yapmak daha kolay, benim buna cevabım ise eğer 259 tane resim çekmek zorunda kalsaydınız.
259*5=1295 işlem edecekti. yazdığımız uygulama ile bu sayı 518′e düşecek.

Bu kadar teorik bilgi yeter sanırım

Öncelikle Visual Studio’muzdan yeni bir Windows Application oluşturuyoruz.

PrintScreen işlemizi şu şekilde yapcağız ; formumuzu ekran görüntüsü almak istediğimiz yerin üzerine getireceğiz. ve üzerine iki kez tıkladığımızda otomatik olarak görüntümüzü istediğimiz formatta alacağız(jpg,bmp,png). Mesala formu bir resin üzerine getirdiğimizde formun arkasında kalan resmi göremeyeceğiz bu sorunuda Form’un Opacity değeriyle oynarak çözeceğiz.
GetCapture adında void türünde bir metot yazacağız bu metot formun bulunduğu yerin lokasyon bilgilerini tutacak. ve bu türde görünmez bir nesne oluşturacağız bu nesnenin lokasyon bilgisini formunki ile dolduracağız. yani this.Bounds;

Daha sonra bitmap sınıfını kullanacağız ve daha önce formun bulundugu noktayı doldurdugumuz nesnemiz olan Rectangle’ın yükseklik genişlik bilgilerini buradan tamamlayacağız. Biraz daha ilerdiğimizde artık kendi grafiğimizi kaydetmemiz adına Graphics türünde bir nesne daha oluşturup,CopyFromScreen diyerek formun kapsadığı alanlarını resim olarak elimizde barındıracağız.

Yani GetCapture fonksiyonumuzun kodu aşağıdaki gibi olacaktır ;
2.jpg

Üstte Bitmap.Save Derken C://’nin altına kaydettim bazı bilgisayarlarda bu kayıt işlemine izin vermez eğer bir hata alırsanız bilesiniz ki bundandır.

@”C:\” + yazı dizisini silerseniz projenizin .exe’sinin çalıştığı yere sorunsuz bir şekilde printScreen alacaktır.

Ayrıda her alınan görüntü üst üste kaydolmasın diye string türünde dd diye bir değişken tanımladım ve tarihi saniyeyle birlikte verdim dolayısıyla oluşan her dosya adı farklı olacak .Replace(‘:’,’.’); diyerek karakter değişimi yaptım ki resim dosyası düzgün kaydolsun(windows herhangi bir dosya kaydolurken ismi içerisibnde ‘:’ ’/’ gibi karakterlerin olmasına izin vermiyor ).

Şimdi formun DoubleClick Event’inde GetCapture metotumuzu çağıralım;
3.jpg

Şimdi ise projeyi çalıştırıyorum ;
4.jpg

Bu şekilde karşıma geldi. Yalnız yazımızın başında bahsettiğim sorun var bu şekilde forma çift tıklarsam ekran görüntümü kaydedecek ama şuan sadece formun kapadığı yerleri alacak ve kapadığı yerlerin altında ne var göremiyorum bu pek sağlıklı bir görüntü değil.

İkinci sorunumuz ise Ekran Çıktısını alırken ne yazık ki formumuz orada olduğu için formumuzun resmini çekecek dolayısıyla burada bir cinlik yapıp, çift click olduğunda ÖNCE formu görünmez yapmalı daha sonra GetCapture fonksiyonumu çağırmalıyım.

Yani formumuzun MouseDoubleClick event’i şu şekilde olmalı ;
5.jpg

Şimdi formumuzun opacity oranını biraz kısmalı ve kullanıcının resmini çektiği alanı daha iyi görmesini sağlamalıyız ;
6.jpg

Şimdi projemi çalıştırıyorum ve ekran görüntümü sizinle paylaşıyorum ;
7.jpg


Gördüğünüz gibi formumuz saydam bir yapı aldı yani kullanıcı artık nerenin görüntüsünü alabileceğini belirleyebilecek halde. Şimdi formum bu haldeyken üzerine doubleClick yapıp oluşan ekran görüntüsünü sizinle paylaşıyorum ve bu yazımıza son veriyoruz ;
ekran-gc3b6rc3bcntc3bcsc3bc-08-02-2011-21-58-33.jpg

Projeyi indirmek için http://mertkanelpeze.net/ders/PrintScreen.rar
 

w4piti

Öğrenci
Katılım
9 Şubat 2011
Mesajlar
15
Reaksiyon puanı
0
Puanları
0
bize bunu okulda göstermekten vazgeçtilerdi.
 

sdmh

Profesör
Katılım
22 Ağustos 2008
Mesajlar
1,108
Reaksiyon puanı
14
Puanları
218
Güzel çalışma tebrik ederim.

private void Form1_DoubleClick(object sender, EventArgs e)
{
GetCapture();

dan sonra this.Visible = true; yaparsan form ekranda tekrar görünür.
 

Jaex

Asistan
Katılım
2 Ocak 2010
Mesajlar
112
Reaksiyon puanı
13
Puanları
18
C# ile yazdığımız screenshot alma projem: http://code.google.com/p/zscreen/
Kaynak kodları belki yardımcı olabilir böyle birşey yapmak istiyenler için.
Saydam screenshot alma gibi özellikleri var ve örnek kod bulamamıştım hiç bu işlem için.
Yeni bir konu açmak istemedim reklam yapmak olur diye.
 

MertkanElpeze

Asistan
Katılım
6 Ekim 2010
Mesajlar
151
Reaksiyon puanı
4
Puanları
18
@sdmh : evet dediğin gibi yalnız sonuna } koymayı unutmuşsun.

@Klex : bu uygulamada sadece basit bir işlem yaptık

@hostbirim1 : teşekkürler

@w4piti : ilginç :)
 

orcnd

Dekan
Katılım
13 Ekim 2008
Mesajlar
6,394
Reaksiyon puanı
255
Puanları
243
kod paylaşırken kodları resim değil metin olarak paylaşmalısınız.
 

MertkanElpeze

Asistan
Katılım
6 Ekim 2010
Mesajlar
151
Reaksiyon puanı
4
Puanları
18
@orcnd : Düşünsene sence resim cekip ,upload edip, paylaşmak mı kolay ? yoksa sadece yazıyı yapıstırmak mı ?
bilerek resim paylaşıyorum. Gerçekten öğrenmek isteyen arkadaşlar yazsın da pratik kazansın diye.
 

orcnd

Dekan
Katılım
13 Ekim 2008
Mesajlar
6,394
Reaksiyon puanı
255
Puanları
243
@orcnd : Düşünsene sence resim cekip ,upload edip, paylaşmak mı kolay ? yoksa sadece yazıyı yapıstırmak mı ?
bilerek resim paylaşıyorum. Gerçekten öğrenmek isteyen arkadaşlar yazsın da pratik kazansın diye.

düşünce şeklin yanlış. bu şekilde sadece klavyede yazma hızları gelişir kod yazma pratiklerine etki etmez. kod yazma hızlarının gelişebilmesi için buraya bakmadan kendileri düşünüp yazmalılar.
 

MertkanElpeze

Asistan
Katılım
6 Ekim 2010
Mesajlar
151
Reaksiyon puanı
4
Puanları
18
düşünce şeklin yanlış. bu şekilde sadece klavyede yazma hızları gelişir kod yazma pratiklerine etki etmez. kod yazma hızlarının gelişebilmesi için buraya bakmadan kendileri düşünüp yazmalılar.

Kod yazma hızının gelişmesi, CTRL + C , CTRL + V geliştirmekten iyidir diye düşünüyorum.
 

orcnd

Dekan
Katılım
13 Ekim 2008
Mesajlar
6,394
Reaksiyon puanı
255
Puanları
243
yazma hızının gelişmesi şüphesiz kopyalamadan iyidir ama bence kazanılan zaman daha önemlidir
 
Üst