Jump to content

C# 2.0 Remoting Uygulamaları 3: Screenlogger


wmismail

Recommended Posts

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)

1000001150_image001.jpg

Ş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.)

1000001150_image002.jpg

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, :dribble:, 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

Archived

This topic is now archived and is closed to further replies.

  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...