wmismail Posted August 10, 2008 Share Posted August 10, 2008 Bu makalede geliştireceğimiz uygulamadan tam randıman sağlayabilmek için bilgisayarımızdaki işlemcinin de orta düzeyin üstünde olması gerekiyor. Özellikle threading yoğunluğu olacağı için, hyper threading destekli işlemciler üzerinde tam performans sağlanabilir. Uygulamayı geliştirdiğim notebookta intel centrino 2.0 ghz işlemci üzerine 1 gb ram vardı. Herhangi bir sorun yaşamadım. Daha sonra evimde intel Pentium 4 2.0 ghz üzerinde denedim orada da sorun yaşamadım. Umarım gerekli randımanı sağlayabilirsiniz. Projemiz diğerleri gibi 3 aşamlı olucak. Önce dll uygulaması tanımlayacağız. Daha sonra görüntüleri takip edebileceğimiz server uygulamamızı geliştireceğiz ve en son olarak da görüntüleri yollayacağımız client uygulamamızı yaratacağız. Dll uygulamamız ile başlayalım. Tüm aşamalarımızda System.Runtime.Remoting namespaceini eklememiz gerekiyor. Ayrıca kodların açıklamaları diğer makalelerde olduğu gibi satır aralarında bulunacak. Dll uygulamamızın kodları: using System; using System.Collections.Generic; using System.Text; using System.Runtime.Remoting; using System.Runtime.Remoting.Channels; using System.IO; using System.Drawing; namespace DllUygulamasi { public interface Arayuz { string ekraniyolla(byte[] Resim); } public class YayinSinifi : MarshalByRefObject, Arayuz { public string ekraniyolla(byte[] Img) { try { ‘tanimladigmiz string degiskenin kaynagini belirtiyoruz string yol = "C:\\Goruntu.bmp"; FileInfo dosyalar = new FileInfo(yol); if (dosyalar.Exists) { dosyalar.Delete(); } ‘dosyamizin tipini,yolunu belirtip yazma olayini gerceklestiriyoruz FileStream dosya = new FileStream("C:\\Goruntu.bmp", FileMode.Create, FileAccess.Write); ‘uygulamanin islevi bitince dosyanin kapanmasini sagliyoruz dosya.Write(Img, 0, (int)Img.Length); dosya.Close(); dosya.Dispose(); } catch { } return null; } } } Buradaki amacımız diğer uygulamalarda olduğu gibi C sürücünde bir dosya yaratıp(.bmp uzantılı) bu dosya üzerinden akış sağlamak. İsterseniz yakaladığınız görüntülerinde loglarını tutabilirsiniz. Tabi yazı olarak değil resim olarak. Şimdiyse görüntüleri takip edeceğimiz server uygulamamızı geliştirelim. Görüntü aşağıdaki gibi olacak ve kodlarımızla beraber açıklamalarız aşağıdaki gibi olacak. (Bir picturebox ve timer nesnesi ekli) Şimdi ise kodlarımıza geçelim: (Dll uygulamamizi da referans olarak göstermeliyiz.) using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.IO; using System.Runtime.Remoting; using System.Runtime.Remoting.Channels; using System.Runtime.Remoting.Channels.Tcp; using DllUygulamasi; using System.Runtime.Serialization.Formatters.Binary; using System.Runtime.Serialization; namespace ScreenLogger { public partial class Form1 : Form { private void Form1_Load(object sender, EventArgs e) { ‘bir tcp kanali acip tipini belirtiyoruz TcpChannel kanal = new TcpChannel(30000); ChannelServices.RegisterChannel(kanal); RemotingConfiguration.RegisterWellKnownServiceType(typeof(YayinSinifi), "Yayin", WellKnownObjectMode.SingleCall); ‘timer nesnemizin degerini belirliyoruz ‘istersek bu sekilde akis hizini yavaslatabilir yada hizlandirabiliriz timer1.Interval = 500; timer1.Start(); ‘pictureboximizi forma tam dayali hale getiriyoruz ‘ve belirledigimiz calisma prosedurune gore goruntuyu olusturuyoruz pictureBox1.Dock = DockStyle.Fill; pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage; Application.Idle += new EventHandler(work); } private void work(object sender, EventArgs e) { try { ‘calisma prosedurumuzde c’nin icindeki goruntu dosyasi kaynagimiz olmus oluyor ‘islem bittikten sonra dosyamizi siliyoruz ‘silmeyip bahsettigim gibi loglayabiliriz string yol; yol = @"c:\Goruntu.bmp"; FileInfo files = new FileInfo(yol); files.Delete(); } catch { }; } private void timer1_Tick(object sender, EventArgs e) { try { ‘burada ise resmi acip pictureboxa gecmesini sagliyoruz ‘timer nesnesinin süresine göre refresh oluyor ve akis saglaniyor ‘son olaraksa dosya siliniyor string yol; yol = @"c:\Goruntu.bmp"; FileInfo files = new FileInfo(yol); if (files.Exists) { FileStream file = new FileStream(yol, FileMode.Open, FileAccess.Read); pictureBox1.Image = Image.FromStream(file); pictureBox1.Refresh(); file.Close(); file.Dispose(); } } catch { }; } } } Görüldüğü gibi bu kodlarla ekran görüntüsü, picturebox üzerindeki timer nesnesinin interval özelliğindeki değer kadar yenileniyor. Böylece görüntüler akıcı bir özellik kazanıp kullanıcıya gösteriliyor. Gelelim client uygulamamıza. Yine dll uygulamamızı referans ettikten sonra tasarımı aşağıdaki gibi oluşturuyoruz ve kodlarımızı yazıyoruz. (Bir button ve bir timer nesnesi eklenmiştir.) Kodlarımıza geçiyoruz: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Runtime.Remoting; using System.Runtime.Remoting.Channels; using System.Runtime.Remoting.Channels.Tcp; using System.Runtime.InteropServices; using System.IO; using DllUygulamasi; namespace Cliento { public partial class Form1 : Form { #region Dll Dosyalari [DllImport("GDI32.Dll")] public static extern bool BitBlt(int deger, int numara, int veri, int uzunluk, int yukseklik, int num, int numar, int paz, int kaz); [DllImport("GDI32.Dll")] public static extern int CreateCompatibleBitmap(int deger, int uzun, int yuk); [DllImport("GDI32.Dll")] public static extern int CreateCompatibleDC(int nesne); [DllImport("GDI32.Dll")] public static extern bool DeleteObject(int nesne); [DllImport("GDI32.Dll")] public static extern int GetDeviceCaps(int nesne, int index); [DllImport("GDI32.Dll")] public static extern int SelectObject(int nesne, int numara); [DllImport("user32.Dll")] public static extern int GetDesktopWindow(); [DllImport("user32.Dll")] public static extern int GetWindowDC(int deger); #endregion public delegate string Isletme(byte[] deger); TcpChannel kanal; Isletme son; public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { ‘bir kanal olusturup yine tipini ve yayin yapacagi portu belirliyoruz ‘kanalimizi aktif hale getiriyoruz ve ekraniyolla isimli dill uygulamamizin ‘akisina gore islem yaptiriyoruz TcpChannel kanal = new TcpChannel(); ChannelServices.RegisterChannel(kanal); Arayuz uzakyuz = (Arayuz)Activator.GetObject(typeof(Arayuz), "tcp://LocalHost:30000/Yayin"); son = new Isletme(uzakyuz.ekraniyolla); } private void timer1_Tick(object sender, EventArgs e) { try { ‘timer nesnesinin degerine göre yukarida belirttigimiz dll dosyalarimizin özellikleri tanimlaniyor ‘ve islemler sirasiyla basliyor int numara = GetWindowDC(GetDesktopWindow()), deger = CreateCompatibleDC(numara), resim = CreateCompatibleBitmap(numara, GetDeviceCaps(numara, , GetDeviceCaps(numara, 10)); SelectObject(deger,resim); BitBlt(deger,0,0,GetDeviceCaps(numara,,GetDeviceCaps(numara,10),numara,0,0, 0x00CC0020); ‘tum dll dosyalarimiza gerekli tanimlar yapildiktan sonra resmin özellikleri belirleniyor Bitmap resimler=new Bitmap(Image.FromHbitmap(new IntPtr(resim)),Image.FromHbitmap(new IntPtr(resim)).Width,Image.FromHbitmap(new IntPtr(resim)).Height); byte[]dizi; try { ‘resim bu kez d sürücüsü icerisinde olusturulur using (FileStream dos=new FileStream("d:\\Resim.jpg",FileMode.Create,FileAccess.Write)) { ‘resmin tipi belirlendikten sonra islemler yapilir ve resimler silinir. resimler.Save(dos,System.Drawing.Imaging.ImageFormat.Jpeg); dizi=new byte[(int)dos.Length]; dos.Close(); resimler.Dispose(); dos.Dispose(); } ‘yukarida resim yazilmisti simdi ise okunuyor ve okunduktan hemen sonra siliniyor FileStream dosoku=new FileStream(":\\Resim.jpg",FileMode.Open,FileAccess.Read); dosoku.Read(dizi,0,(int)dizi.Length); dosoku.Close(); dosoku.Dispose(); } finally { resimler.Dispose(); } son(dizi); } catch{}; } private void button1_Click(object sender, EventArgs e) { ‘start buttonuna basildiktan sonra timer nesnesinin degerine gore hareket ediliyor timer1.Interval = 50; timer1.Start(); } } } Tüm bu aşamaları oluşturduktan sonra önce server uygulamamızı arkasından da client uygulamamızı çalıştırıp sonucu alabilirsiniz. Böylelikle 3 diziden oluşan makale serimizin sonuna geldik. Umarım logger mantığını anlamış olup C#.net ile remoting konusunda biraz da olsa yararlı birikime sahip olabilmişsinizdir. C#.Net’in detaylarını ve inceliklerini kavradıktan sonra inanın remoting uygulamaları çok keyifli bir hal alıyor. Basitten zora doğru uygulamalar geliştirerek derinlik kazanabilir, C#.Net’in güzelliklerinden yararlanabilirsiniz. Link to comment Share on other sites More sharing options...
Recommended Posts
Archived
This topic is now archived and is closed to further replies.