C# 2.0 Remoting Uygulamaları 3: ScreenLogger

Yağız Gönüler tarafından yayınlanmıştır 13. Ağustos 2008 12:21

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, 8), GetDeviceCaps(numara, 10));

SelectObject(deger,resim);

BitBlt(deger,0,0,GetDeviceCaps(numara,8),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.

1 kişi tarafından 1.0 olarak değerlendirildi

  • Currently 1/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Etiketler: , , ,

Software | Articles | Windows

Yorumlar

Yorum ekle


(Gravatar simgesini gösterecek)  

  Country flag

biuquote
  • Yorum
  • Canlı önizleme
Loading





Bu site BlogEngine.NET 1.4.5.0 ile oluşturulmuştur. Türkçe çevirisi BlogEngine TR ekibi tarafından yapılmıştır.
Sitedeki kod ve tasarım değişiklikleri ise Yağız Gönüler tarafından geliştirilmiştir.
2008 © www.yagizgonuler.com

Şifahen değil acilen!

Anket

Yazılım geliştirirken en keyif aldığınız alan hangisi?




Sonuçlar

Son Yorumlar

Comment RSS

Calendar

<<  Ocak 2009  >>
PaSaÇaPeCuCuPa
2930311234
567891011
12131415161718
19202122232425
2627282930311
2345678

Yazıları geniş takvimde göster

Ne Dinliyorum?

Kirpi - TearDrop (11 saat önce)
Kirpi - My Name Is Kirpi (11 saat önce)
Kirpi - The Song (11 saat önce)
Kirpi - Spell (11 saat önce)
Huseyin Karadayi - Bonus Track Funk Clarinet (String Mix) (11 saat önce)
Huseyin Karadayi - Sacred Gate (11 saat önce)
Huseyin Karadayi - Exotica (11 saat önce)
Huseyin Karadayi - Take Me Away / No Time To Waste (Vocal By Melis Sökmen) (11 saat önce)
Huseyin Karadayi - Eyes Don't Lie (Duet By Enoi & Funky C) (11 saat önce)
Huseyin Karadayi - This Way (Usy Groove) (11 saat önce)

Ne Okuyorum?


Haftanın Sözü


"Sukûnetim asaletimdendir;
Lâkin her lâfa verilecek bir cevabım var.
Bir bakarım lâf lâfmı diye,
Birde bakarım söyleyen adammı diye.."

Mevlânâ Celaleddin-i Belhi Rumi
(1207-1273)

Adanmış Hayatlar

"Zaten aşklar hep yalan dolan,
Sonu hep acı hüsran.
Bize her sevdadan geriye kalan
Sadece Galatasaray..
"

Son Dakika

İstanbul'da Hava

ISTANBUL

Ziyaretçi Sayısı

Ziyaretçi Sayısı