• SDN Forum üyelikleri çok yakında yeniden açılıyor. Siz de bu büyük topluluğun bir parçası olmak için bizi takipte kalın, gelişmeleri kaçırmayın!

C# ile Print Screen Almak

Katılım
6 Ekim 2010
Mesajlar
151
Tepki 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
 
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.
 
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.
 
@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ç :)
 
kod paylaşırken kodları resim değil metin olarak paylaşmalısınız.
 
@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 : 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.
 
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.
 
yazma hızının gelişmesi şüphesiz kopyalamadan iyidir ama bence kazanılan zaman daha önemlidir
 
Üst