İçeriğe geç
ShiftDelete.Net
Haber ara/ SDN'ye SorGiriş
Haber Akışı SDNTV İnceleme Forum Yapay Zeka Akıllı Telefon Elektrikli Otomobil Oyun ShiftDelete.Net Global Teknoloji Haberleri Mobil Otomobil Donanım Savunma Bilim Sosyal Medya İnternet Giyilebilir Teknoloji Rehber Ürünler Son dakika Yazarlar
  1. Ana sayfa
  2. Topluluk
  3. Programlama
  4. Programlama Dilleri
Programlama Dilleri

C# ile Print Screen Almak

MertkanElpeze09.02.201112 cevap6.455 görüntüleme
2010'den beri151 mesaj
#1
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 ;

Ü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;

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

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ı ;

Ş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 ;

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


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 ;

Projeyi indirmek için http://mertkanelpeze.net/ders/PrintScreen.rar
Cevaplar
2011'den beri15 mesaj
#2
bize bunu okulda göstermekten vazgeçtilerdi.
MertkanElpeze Konuyu açan
2010'den beri151 mesaj
#3
w4piti dedi: ↑
bize bunu okulda göstermekten vazgeçtilerdi.
neden vazgeçtiler :)
2008'den beri1.108 mesaj
#4
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.
2010'den beri112 mesaj
#5
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.
2011'den beri52 mesaj
#6
yararlı bir konu
2011'den beri15 mesaj
#7
MertkanElpeze dedi: ↑
neden vazgeçtiler :)
bilmiyorum ki C c+ falan göstercez demişlerdi sonra son seneye geldik gösterilmeyecek dediler.
3 sene oldu bitireli zaten çok istemiştim ilgimi çekerdi php den çok
MertkanElpeze Konuyu açan
2010'den beri151 mesaj
#8
@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ç :)
2008'den beri6.394 mesaj
#9
kod paylaşırken kodları resim değil metin olarak paylaşmalısınız.
MertkanElpeze Konuyu açan
2010'den beri151 mesaj
#10
@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.
2008'den beri6.394 mesaj
#11
MertkanElpeze dedi: ↑
@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 Konuyu açan
2010'den beri151 mesaj
#12
orcnd dedi: ↑
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.
2008'den beri6.394 mesaj
#13
yazma hızının gelişmesi şüphesiz kopyalamadan iyidir ama bence kazanılan zaman daha önemlidir

Cevabını yaz

Cevap yazmak için giriş yap ya da üye ol. Eski forum kullanıcı adın ve parolanla girebilirsin.