Turkhackteam.net/org - Turkish Hacking & Security Platform  
Geri git   Turkhackteam.net/org - Turkish Hacking & Security Platform >
Programlama
> C# j# vb.net (.NET dilleri)






C#: Hadi ekranda böcek gezdirelim...

C# j# vb.net (.NET dilleri)

Yeni Konu aç Cevapla
 
Seçenekler
Alt 14-04-2018   #1
  • Yarbay
  • Üye Bilgileri
Üyelik tarihi
07/2015
Nereden
Ankara
Mesajlar
Konular


  
C#: Hadi ekranda böcek gezdirelim... / AR-GE Kulübü



Öğrenilmesi planlananlar:

- Form Transparancy
- Custom formlar, genişletilmiş stiller
- Trigonometri - açılar ve bunların programa uygulanması
- Paint override
- İmaj manipulasyonu

Diyelim ki amacımız hedefimizin şifrelerini çalmak, bilgisayarını ele geçirmek falan filan değil de.... azıcık korkutmak... Eşek şakası..

E özellikle hedef bayan arkadaşımız ise ekranda gezinen böcekler en güzel hediye değil midir?

Bence öyledir. Bundan dolayı da, böcek gezdireceğiz. Siz istediğiniz imajı kullanın..

Öncelikle internetten bir böcek gif'i buluyorum;



Sonra tembel biri olduğumdan, ezgif.com'a girip bir iki düzenleme yapıyorum...



Neden sağa bakacak şekilde çevirdim? Tembellik.. Trigonometri derslerini hatırlayın, 0 derece nasıl gösterilir? +X doğrultusu, yani şu anda böceğimizin baktığı yön değil mi? Şu anda 0 derecenin kosinüsü böceğin yatay miktarda gideceği yönü yani 1'i, sinüsü ise dikey yönde ilerleyeceği miktarı yani 0'ı veriyor.

Şimdi yeni bir C# winforms projesi oluşturalım.

Önümüze hemen bir tane "Form1.cs" formu oluşturup çıkardı. Böcekler bu formların içinde çizilecekler. Forma "Solution Explorer" üstünde tıklayalım, F2'ye basalım, adını değiştirelim...



Bize "yahu dosyanın adını değiştirdin, Class adını da değiştirelim mi?" diye sorar. Evet diyelim. İstiyoruz.

Ardından özelliklerden bir kaç şeyi hızlıca değiştirelim. İlk iş, bu form için kenar vs. istemiyoruz. FormBorderStyle 'none' olacak yani.. TopMost "true" olacak, mümkün olan her an bu böceğin en üstte olmasını istiyoruz.

Ardından önemli bir noktaya geliyoruz. Transparancy key... Eğer bu ayarlı ise, windows bu formu çizerken bu rengi gördüğü pikselleri çizmez. Deneme için önce şimdi F5'e basalım, normal gri bir pencerenin sol üstte göründüğüne şahit olduk.

Şimdi shift+F5'e basıp sonlandıralım ve de formun BackColor özelliğini de, Transparancy Key özelliğini de White - beyaz yapalım. Tekrar çalıştıralım... Olması gereken yerde hiç bir şey yok değil mi? Mükemmel.

Son olarak da ShowInTaskbar'ı false yapalım, açık bir program olarak görev çubuğunda görünsün istemiyoruz. StartPosition'ı da Manual yapalım. Böcek nerelerde görünecek biz belirleyeceğiz.

Şimdi F7 tuşuna basıp kodu düzenlemeye başlayalım...

Öncelikle Constructor'ımıza..

Kod:
DoubleBuffered = true;
satırını ekleyelim. Böylece windows'a "çift buffer kullan ama pır pır etmeden çiz benim böceğimi" diyoruz.

Şimdi en büyük sorunlarımızdan biri, kullanıcının alt+tab gibi bir kombinasyonla böceğimizi seçebileceği, ardından da onu kapatabileceği...

Nasıl kurtuluruz? Eğer bir toolbar olsa idik, windows bizi pencereden saymaz, tab ile geçerken bize sıra getirtmezdi. Bunu nasıl yaparız? Extended Params ile, yani genişletilmiş form oluşturma parametreleri ile...

Constructor fonksiyonun hemen altına gelip "override createparams" yazalım, ta ki parametre oluşturma fonksiyonu listede görünene dek.. Sonra taba basarak, override kısmını kolayca halletmesini sağlayalım.



Şimdi öncelikle, neredeyse her şey standart olacak. Bundan dolayı base class'ımız olan Form bizim için parametre oluştursun. Sonra bu parametre objesinin ExStyle - extended style - genişletilmiş stiline bir de 0x80 ekleyelim. Yeni parametremiz bu. 0x80'i nereden buldum? Buradan: https://msdn.microsoft.com/en-us/lib...v=vs.110).aspx



Kod yazmanın en önemli noktalarından biri araştırmaktır. C#'ta yazıyorsanız, msdn'de istediğiniz özellikleri aramayı öğrenmeniz lazımdır. O konuda bir kısayol yok, ben de sizin araştıracağınız gibi araştırıyorum. Ezberimde değil yani...

Neyse, artık böceğimizi formun içine çizelim mi?

Öncelikle projemizin üstünde sağ tıklayıp Properties'i seçelim. Sonra Resources içinde, yeni kaynağımızı yükleyelim; yani gif imajımızı... AMA ÖNEMLİ BİR AYRINTI. UZANTISINI SİLİN.

Evet, gif'i byte array olarak görmek istiyoruz. Daha uzun yolları var ama bir gif'in framelerine ulaşmanın en kolay yolu onu programa byte array olarak alma.



Ben adını "bocek" diye de değiştirdim.

Sonra bir kaç şeyi hesaplıyoruz.

Mesela benim imajım 50x50 boyutunda. Bu dönerken en uzun olduğu zaman nedir? 45 derece ve benzeri dikten 45 derece uzak olduğu açılarda. Neden? O zaman bir köşegen tam yatay olur. Bu köşegenin boyutu da 50√2 yani yaklaşık 71 pikseldir. Yani her ne kadar böcek 50x50 de olsa, 45 derece çevirdiğimizde kapladığı dikdörtgensel alan 71x71 oluyor. Biz de formumuzu bu boyutta yapalım ki böceğin hiç bir parçası kaybolmasın.



Ne yaptık? Resource olarak aldığımız böcek resminin genişliğini 2'nin kökü ile çarptık, Math.Ceiling fonksiyonu ile onu yukarı yuvarladık, sonra da int'e çevirdik. Bu hem formumuzun genişliği, hem de yüksekliği.

Artık son iş, çizmeye geldi... Aslında en karışık bölüm burası...

Form özelliklerinde bir "Paint" event handler'ı ekleyelim...



Burada yapılması gereken nedir? İmajı çizeceğiz. Çizerken belli bir açıda döndürmek için üç noktayı referans alan DrawImage versiyonunu kullanacağız. Oldukça bunaltıcı bir kod olacak.. Ama önce bir "aci" yani dönüş açısını tanımlayalım ki canımız istediğinde değiştirebilelim. Hazır elimiz değmişken, bir "random" da tanımlayalım. Rastgele değişiklikler yapacağız ki dönecek böceğimiz.

Bir GIF dosyasındaki frameler hakkında bilgi almak için, öncelikle onun "FrameDimension" objesini oluştururuz. Yani standartlarda animasyonlu bir imaj içinde birden fazla "frame kümesi" olabildiği varsayılmıştır. GIF'lerde sadece bir frame kümesi olabileceğinden, biz bu ilk frame kümesi için FrameDimension da oluşturuyoruz.

Bir kareyi merkezinden çevirdiğimizi düşünelim. Tam tur döndüğünde, çapı karenin köşegeni kadar olan bir daireyi dolaşmış olur. Zaten sırf bu sebepten formumuzun boyunu imajımızın köşegeni ile eşit yapmıştık.

Şimdi imajı istediğimiz gibi döndürmek için Graphics.DrawImage(Image imaj, PointF[] parallellogram) fonksiyonunu kullanacağız. Bu biraz açıklama gerektiriyor.

Şeklimiz nasıl dönmüş veya yamulmuş olursa olsun, biz resmin geleceği noktanın sırayla sol üst, sağ üst ve sol alt noktalarının nereye geleceğini söylersek, bilgisayar düzgünce çizer. Bize düşen bu üç noktayı hesaplamaktır.



Yukardaki resimde küçük kare resim, büyük kare form, daire de resmin gelebileceği bütün noktaların oluşturduğu dairedir. Resmin herhangi bir açı için sol üst köşesi her zaman için 135 derecede çizilmiş bir yarıçapın ucu, sağ üst 45 derece, sol alt ise -135 derecedir.

Ve son dikkat etmemiz gereken nokta da ekranda Y koordinatının aşağıya doğru giderken artması, koordinat doğrusunda ise bunun tam tersi olmasıdır. Yani Y değeri eklerken aslında işaretini ters çevirmeliyiz.

Şimdi öncelikle, temel açıları, kullanacağımız "Random", yani rastgele sayı üretme objesini, yarıçapı vs. hesaplayacak şekilde constructor'ımızı düzenleyelim. Bir de koordinatları tutacak x ve y değişkeni tanımlayalım. Ondalıklı koordinatlarla çalışacağız ama böceği yerine oturturken bunları 'int'e dönüştüreceğiz.



Şimdi şurası komik, değil mi?

Kod:
aci = rnd.NextDouble() * 2 * Math.PI;
rnd.NextDouble() bize 1 hariç, 0 ile 1 arasında rastgele bir ondalıklı sayı verdi. Bundan rastgele bir açı üretmek için 360 ile çarpmamız gerekmez miydi?

Ne yazık ki hayır. Bütün C# trigonometrik fonksiyonları derecelerle değil, radyan ile çalışır. Pi, 180 derecedir. 2 x PI de tabii ki 360 derece...

Şimdi de bu hayali daire üstünde istediğimiz açıdaki yarıçapın uç noktasını hesaplayan bir fonksiyon yazalım...



Yarıçapa r dersek, formumuzun, hayali dairemizin ve imajımızın merkezi (r,r) noktasıdır. Bu noktadan itibaren yatay düzlemde açımızın kosinüsünü ekliyoruz. Y koordinatları ekranda ters olduğundan, dikey düzlemde ise açımızın sinüsünü çıkarıyoruz.

Yani değerimiz (r+r.cosβ,r-r.sinβ) oluyor.. Bunu da sadeleştirince (r(1+cosβ),r(1-sinβ)) değerini buluyoruz.

Şimdi de paint metodunun içini dolduralım. Zor işi bitirdik, kalanı çok kolay...



Ne dedik yani, açımız her ne ise, ona göre paralellogram noktalarını, yani 135,45 ve -135 derecedeki noktaları bul, o noktalara göre çiz. Mesela örnek olarak şimdi çalıştıralım... Her çalıştırmamızda farklı bir açıda, farklı bir hareket noktasında ve de farklı bir yerde gelir.

Tabii sol üstte takılıp kaldı formumuz. Son işimiz nedir? Hareket etmesi!

Şimdi designer'a gelelim, bir tane Timer ekleyip bu timer'ın adını "animasyon" yapalım. Sonra da çift tıklayıp bu timer'ın "Tick" ettikçe ne yapacağını da yazalım.

Önce yazı tura atalım, yazı gelirse böceğimiz azıcık dönsün. Sonra yine yazı tura atalım, yazı gelirse böceğimiz azıcık hareket etsin...



Şimdi önce bütün kodu commentli olarak paylaşalım...

Kod:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace HamamBocegi
{
    public partial class Bocek : Form
    {
        private static Random rnd = new Random();
        private double aci, yariCap, x, y;
        private int resimdekiFrameSayisi;
        private System.Drawing.Imaging.FrameDimension frameDimension;
        private int suankiFrame;
        private Bitmap bocek;
        public Bocek()
        {
            InitializeComponent();
            //Byte array'i bir memorystream'e dönüştürdük, onu da bitmap'e..
            //Böylece "resources" içinde olmayan bir imajımız var.
            bocek = new Bitmap(new System.IO.MemoryStream(Properties.Resources.bocek));
            //Radyan kullanıyoruz, açı 0 ile 2pi arası bir değer.
            aci = rnd.NextDouble() * 2 * Math.PI;
            //Doublebuffered, yani pırlama yapmayacak.
            DoubleBuffered = true;
            //Genişlik böcek resminin köşegeni kadar, hakeza yükseklik
            Width = (int)Math.Ceiling(bocek.Width * Math.Sqrt(2));
            Height = Width;
            //Yarıçap bunun yarısı kadar oluyor.
            yariCap = Width / 2;
            //Frameleri almamızı sağlayan FrameDimension
            frameDimension = new System.Drawing.Imaging.FrameDimension(bocek.FrameDimensionsList[0]);
            //Kaç framemimiz varmış?
            resimdekiFrameSayisi = bocek.GetFrameCount(frameDimension);
            //Rastgele bir frame'den başlayalım.
            suankiFrame = rnd.Next(0, resimdekiFrameSayisi);
            //O frame'i seçelim böcekte de..
            bocek.SelectActiveFrame(frameDimension, suankiFrame);
            //Rastgele bir koordinat...
            Left = rnd.Next(Screen.PrimaryScreen.WorkingArea.Left, Screen.PrimaryScreen.WorkingArea.Right);
            Top = rnd.Next(Screen.PrimaryScreen.WorkingArea.Top, Screen.PrimaryScreen.WorkingArea.Bottom);
            //X ve Y'yi de eşitleyelim.
            x = Left;
            y = Top;
        }
        protected override CreateParams CreateParams
        {
            get
            {
                //Standart form parametrelerini alırız...
                CreateParams parametreler = base.CreateParams;
                //Extended Style - genişletilmiş stil değerine "ben toolbarım" değerini yani 0x80'i ekleriz.
                parametreler.ExStyle |= 0x80;
                //Yeni parametremiz budur.
                return parametreler;
            }
        }

        private vòid Bocek_Paint(object sender, PaintEventArgs e)
        {
            //Sol üst, sağ üst ve sol alt noktaları açıya göre belirleyip çizelim.
            e.Graphics.DrawImage(bocek, new System.Drawing.PointF[] { noktaHesapla(Math.PI*3/4), noktaHesapla(Math.PI/4), noktaHesapla(-Math.PI*3/4) });
        }

        private PointF noktaHesapla(double aciFarki)
        {
            double yeniAci=aci+aciFarki;
            //Y koordinatı ters, ondan toplamak yerine çıkarıyoruz.
            return new PointF((float)(yariCap * (1 + Math.Cos(yeniAci))), (float)(yariCap * (1 - Math.Sin(yeniAci))));
        }

        private vòid animasyon_Tick(object sender, EventArgs e)
        {
            //Eğer böceğin hareketsiz kaldığı bir an olursa, formu Rèfresh etmeyeceğiz.
            bool RèfreshLazim = false;
            //Önce zar atıyoruz. 0 ile 1 arasında bir sayı seçtiriyoruz, 0 ise azıcık dönecek, 1 ise aynı yönde duracak.
            if (rnd.Next(2) == 0)
            {
                //0-1 arası değer seçip, ondan .5 çıkarınca aslında -.5 ve .5 arasında bir değer seçmiş olduk.
                aci += (rnd.NextDouble() - .5) / 10;
                RèfreshLazim = true;
            }
            //Tekrar zar atıyoruz. Eğer 0 çıkarsa hareket edecek, yoksa duracak.
            if (rnd.Next(2) == 0)
            {
                //önce gif animasyonunu bir sonraki frame'e geçirelim. Tabii zaten animasyonun sonundaysak başa dönelim.
                suankiFrame = (suankiFrame + 1) % resimdekiFrameSayisi;
                bocek.SelectActiveFrame(frameDimension, suankiFrame);
                //Şimdi böceğimizi, yani bütün formu toplam 5 piksel ilerletelim.
                //Tabii x yönünde cos(aci) kadar ilerleyecek, y yönünde -sin(aci) kadar..
                x += Math.Cos(aci);
                y -= Math.Sin(aci);
                Left = (int)x;
                Top = (int)y;
                //Ekranın solundan çıkarsa ekranın en sağına taşıyalım. Ekranın sağından çıkarsa soluna.
                //Üst ve alt için de aynı şeyi yapalım.
                //1 form boyutu kadar marjin veriyoruz. Yani azıcık ekran dışına taşabilecek...
                if (Right < Screen.PrimaryScreen.WorkingArea.Left - Width) Left += Screen.PrimaryScreen.WorkingArea.Width + Width;
                else if (Left > Screen.PrimaryScreen.WorkingArea.Right + Width) Left -= Screen.PrimaryScreen.WorkingArea.Width + Width;
                if (Bottom < Screen.PrimaryScreen.WorkingArea.Top - Height) Top += Screen.PrimaryScreen.WorkingArea.Height + Height;
                else if (Top > Screen.PrimaryScreen.WorkingArea.Bottom + Height) Top -= Screen.PrimaryScreen.WorkingArea.Height + Height;
                RèfreshLazim = true;
            }
            //hareket etmiş veya dönmüşse tekrar çizilsin...
            if (RèfreshLazim) Rèfresh();
        }
    }
}
Not: è ve ò harfleri forum sansüründen kurtulmak içindir. Onları normal e ve o yapmayı akıl edersiniz artık canım...

Bu da örnek videomuz...


Bir de örnek dosya koyalım görmek isteyenler için ve bu yazımızı bitirelim...

Dosya: http://www.filedropper.com/hamambocegi
Virüstotal: https://www.virustotal.com/#/file-an...UyMzczMDA1MA==
    


___________________________________________

Gayrıresmi Trolleme Kulübü Kurucu Üyesi...

Sii Şarp: 430%
Site yapmah: 386%
Piieyçpii: 396.8%
Cava: 205%
Andıroyid: 37.9²%
Nodjiies: 196%
Sii artı artı: 342.333333334%
Yuniti: 154%
Paytın 304%
Bat dosyasıyla hedef çökertme: 96i+382√17%


Konu zztri tarafından (17-04-2018 Saat 17:31 ) değiştirilmiştir..
 Offline  
 
Alıntı ile Cevapla
Alt 14-04-2018   #2
  • Asteğmen
  • Üye Bilgileri
Üyelik tarihi
12/2017
Nereden
Internet
Mesajlar
Konular


  


Sineğin olayım oynat beni zztri.
    
 Offline  
 
Alıntı ile Cevapla
Alt 14-04-2018   #3
  • Forumdan Uzaklaştırıldı
  • Üye Bilgileri
Üyelik tarihi
08/2017
Nereden
Elveda.
Mesajlar
Konular


  


Kaldı 2 konu
    
 Offline  
 
Alıntı ile Cevapla
Alt 14-04-2018   #4
  • Yarbay
  • Üye Bilgileri
Üyelik tarihi
07/2015
Nereden
Ankara
Mesajlar
Konular


  


Alıntı:
ImCazZ´isimli üyeden Alıntı Mesajı göster
Kaldı 2 konu
Bitmedi, telefonda olacağım ama orada anlatamam... Kızlarım parka gitmek istiyorlar, hava mükemmel, kusura bakmayın öncelik onlarda.

Sonraki konu, "internet explorer"ı C# üstünden yönetmek ve bu yöntemle bot yapmak.

Ondan sonraki konu da Tor ağı kullanarak mailbomber yapmak. Üçüncü konu gmail'de filan işlemez, boşuna heveslenmeyin.
    


___________________________________________

Gayrıresmi Trolleme Kulübü Kurucu Üyesi...

Sii Şarp: 430%
Site yapmah: 386%
Piieyçpii: 396.8%
Cava: 205%
Andıroyid: 37.9²%
Nodjiies: 196%
Sii artı artı: 342.333333334%
Yuniti: 154%
Paytın 304%
Bat dosyasıyla hedef çökertme: 96i+382√17%

 Offline  
 
Alıntı ile Cevapla
Alt 14-04-2018   #5
  • Binbaşı
  • Üye Bilgileri
Üyelik tarihi
06/2015
Mesajlar
Konular


  


İlginç bir konu olmuş elinize sağlık
    


___________________________________________

Ben Ezelden Beridir Hür Yaşadım Hür Yaşarım
Hangi Çılgın Bana Zincir Vuracakmış Şaşarım

 Offline  
 
Alıntı ile Cevapla
Alt 14-04-2018   #6
  • Tamamen Forumdan Uzaklaştırıldı
  • Üye Bilgileri
Üyelik tarihi
09/2017
Nereden
İzmir
Mesajlar
Konular


  


Böcek değilde başka birşey oluşturabiliyormuyu peki
    
 Offline  
 
Alıntı ile Cevapla
Alt 14-04-2018   #7
  • Teğmen
  • Üye Bilgileri
Üyelik tarihi
06/2017
Nereden
Konstantin
Mesajlar
Konular
3


  


Iykh.. böğecek.
(Keneye daha çok benziyor tâbi oda bir böcek.)
    


___________________________________________

Hayat bal tadındadır, Adamı aldatır.
 Offline  
 
Alıntı ile Cevapla
Alt 14-04-2018   #8
  • Sosyal Medya Timi Asistanı
  • Üye Bilgileri
Üyelik tarihi
12/2015
Nereden
Öteki Taraf
Mesajlar
Konular


  


@zztri örnek bir insan. Emeğine sağlık.
    


___________________________________________

Altın harflerle yaz mahlasımı
 Offline  
 
Alıntı ile Cevapla
Alt 14-04-2018   #9
  • Üsteğmen
  • Üye Bilgileri
Üyelik tarihi
07/2017
Nereden
ANGARA
Yaş
16
Mesajlar
Konular


  


eline sağlık
    


___________________________________________

şiirlerle bile anlatılamayacak kadar güzelsin, nasıl şair olmamı beklersin?


Kim o, deme boşuna…
Benim, ben.
Öyle bir ben ki gelen kapına;
Başdan başa sen.
2=1 özdemir asaf

"Bıraksaydın da son sözümü söyleseydim, arar bulurdun gerçekten özleseydin.''
 Offline  
 
Alıntı ile Cevapla
Alt 14-04-2018   #10
  • Yarbay
  • Üye Bilgileri
Üyelik tarihi
07/2015
Nereden
Ankara
Mesajlar
Konular


  


... Düzeltmeler yapıldı... kaldı 2 konu...
    


___________________________________________

Gayrıresmi Trolleme Kulübü Kurucu Üyesi...

Sii Şarp: 430%
Site yapmah: 386%
Piieyçpii: 396.8%
Cava: 205%
Andıroyid: 37.9²%
Nodjiies: 196%
Sii artı artı: 342.333333334%
Yuniti: 154%
Paytın 304%
Bat dosyasıyla hedef çökertme: 96i+382√17%

 Offline  
 
Alıntı ile Cevapla
Cevapla

Bookmarks

Seçenekler


Bilgilendirme Turkhackteam.net/org
Sitemizde yer alan konular üyelerimiz tarafından paylaşılmaktadır.
Bu konular yasalara uygunluk ve telif hakkı konusunda yönetimimiz tarafından kontrol edilse de, gözden kaçabilen içerikler yer alabilmektedir.
Bu tür konuları turkhackteamiletisim [at] gmail.com mail adresimize bildirebilirsiniz, konular hakkında en kısa sürede gerekli işlemler yapılacaktır.
Please Report Abuse, DMCA, Harassment, Scamming, Warez, Crack, Divx, Mp3 or any Illegal Activity to turkhackteamiletisim [at] gmail.com

Türkhackteam saldırı timleri Türk sitelerine hiçbir zararlı faaliyette bulunmaz.
Türkhackteam üyelerinin yaptığı bireysel hack faaliyetlerinden Türkhackteam sorumlu değildir. Sitelerinize Türkhackteam ismi kullanılarak hack faaliyetinde bulunulursa, site-sunucu erişim loglarından bu faaliyeti gerçekleştiren ip adresini tespit edip diğer kanıtlarla birlikte savcılığa suç duyurusunda bulununuz.



         

Powered by vBulletin® Copyright ©2000 - 2018

TSK Mehmetçik Vakfı

Türk Polis Teşkilatını Güçlendirme Vakfı



Google+

wau

Search Engine Friendly URLs by vBSEO 3.6.0 ©2011, Crawlability, Inc.