c# etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
c# etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

29 Ekim 2011 Cumartesi

C#'da bir windowun ekran görüntüsü almak

Handle değeri bilinen bir windowun c#'da ekran görüntüsü almak istiyorsak yapmamız gereken şu oluyor;


Önce user32.dll altındaki bu iki fonksiyonu ekliyoruz.

[DllImport("user32.dll")]
private static extern bool GetWindowRect(IntPtr hWnd, ref Rectangle rect);

[DllImport("user32.dll")]
public static extern bool PrintWindow(IntPtr hWnd, IntPtr hdcBlt, int nFlags);

GetWindowRect() fonksiyonu handle değeri verilen windowun Rectangle tipinde referansı verilmiş konum bilgisini verir. Bu tipteki yapıyı da şöyle tanımlıyoruz;

[StructLayout(LayoutKind.Sequential)]
public struct RECT
{
public int Left; // sol üst köşenin x tipinde poziyonu
public int Top; // sol üst köşenin y tipinde pozisyonu
public int Right; // sağ alt köşenin x tipinde pozisyonu
public int Bottom; // sağ alt köşenin y tipinde pozisyonu
}

Daha sonra da iş yapan methodumuz şu şekilde;

private void goruntuAl(IntPtr handle)

{
RECT wRect = new RECT();
GetWindowRect(handle, ref myRect);
int width = myRect.Right - myRect.Left;
int height = myRect.Bottom - myRect.Top;
Bitmap bmp = new Bitmap(width, height);
Graphics gfxBmp = Graphics.FromImage(bmp);
IntPtr hdcBitmap = gfxBmp.GetHdc();
PrintWindow(handle, hdcBitmap, 0);
gfxBmp.ReleaseHdc(hdcBitmap);
gfxBmp.Dispose();
mp.Save("test.png");
}

21 Haziran 2009 Pazar

Dlink Dsl 500-G Modem İçin IP Değiştirme Programı

İnanın yapılacak açıklama başlıktan daha uzun değil. Bitti bile : ) 

Programı kendim için yazdım. Herhangi bir hatanızda çökebilir, D-Link DSL-500G harici adsl modemlerde çalışmaz, sefam olsun oh oh. 

Kendim için yazdığım Rapidshare download programının minik bir parçası oluyor. O yüzden kodlarını vermiyorum. Üşenmez, yarıda bırakmazsam Free Rapid Premium gibi uyduruk, dandirik ve lame bir isim vermeyi düşündüğüm programın kodlarını veririm. Onda en çok kullanılan 10-20 modem için kendinden ayarları yüklü olacak ama işte "bak şimdi şunu şunu yap sonra da bana şunu şunu söyle" şeklindeki lafımı dinleyecek 10-20 arkadaşım var mı tartışılır.

Bak ya geçenlerde bi arkadaşla oturuyoruz.... eheh napıyom ben ya. Takılın işte. 

"Eeey siz gariban D-Link 500-G kullanıcıları. Eeey en büyük çileyi çekenler!! açılışı sizinle yapıyorum. Yüzünüz kararmaya, boynunuz bükülmeye!"

Link: http://rapidshare.com/files/247162210/ipayarla.exe.html

14 Nisan 2009 Salı

C#'ta bir processi suspend ve resume eylemek, güzel eylemek

Bir alttaki "C# Memory Searcher" ile alakalı bir projede bir processi suspend(askıya almak) ve resume(çözmek falan işte) etmem gerekiyordu. Bu konuda bulabildiğim uygun tek örnek de c++ için konsolda çalışan bir programdı. Aslında bir tane de Hindu bir amcanın c# ile mobil sistemler için yazdığı vardı ama hatalı olduğu gibi gereksizce işimi uzatmaktan başka bir işe yaramadı o da.
Neyse yavaştan başlayalım.
Öncelikle bir programı suspend etmek demek günümüzün multithreading yapısında o processin threadlerini suspend etmek demektir. Başka bir programın threadlerine ulaşıp onlarla oynamak gibi low level bir olayı da c# bize doğrudan izin vermiyor. Hatta Process sınıfında threads bölümü bile non-public. Neyse konuya dönelim. Bunun için bir kaç adet Win32 API kullanıyoruz.

1. CreateToolhelp32Snapshot ile bellekteki çalışan programların snapshotını alıyoruz
2. Thread32first ile ilk thread hakkında bilgilere uaşıyoruz
3. Thread32next ile bir sonraki threade geçiyoruz
4. SuspendThread ile threadi donduruyoruz
5. ResumeThread ile threadi çözüyoruz.

Demin yanlışlıkla sayfayı geri aldım ve son yazdıklarımın büyük çoğunluğu uçtu gitti. Ayıp oldu. Kızdım ben de o güzel açıklamalardan mahrum kaldınız :P:P

[DllImport("kernel32.dll", EntryPoint = "CreateToolhelp32Snapshot", SetLastError = true)]
public static extern IntPtr CreateToolhelp32SnapshotAPI(ulong flags, uint processid);

[DllImport("kernel32.dll", EntryPoint = "Thread32First", SetLastError = true)]
public static extern bool Thread32First(IntPtr handle, ref Patcher.THREADENTRY32 te32);

[DllImport("kernel32.dll", EntryPoint = "Thread32Next", SetLastError = true)]
public static extern bool Thread32Next(IntPtr handle, ref Patcher.THREADENTRY32 te32);

[DllImport("kernel32.dll", EntryPoint = "OpenThread", SetLastError = true)]
public static extern IntPtr OpenThread(uint dwDesiredAccess, bool bInheritHandle, uint dwThreadId);

[DllImport("kernel32.dll", EntryPoint = "SuspendThread", SetLastError = true)]
public static extern uint SuspendThread(IntPtr handle);

[DllImport("kernel32.dll", EntryPoint = "ResumeThread", SetLastError = true)]
public static extern uint ResumeThread(IntPtr handle);

public struct THREADENTRY32
{

public uint dwSize;

public uint cntUsage;

public uint th32ThreadID;

public uint th32OwnerProcessID;

public int tpBasePri;

public int tpDeltaPri;

public uint dwFlags;

}

public void Suspend(Process ProName)
{




try
{
thandle = Readerapi.CreateToolhelp32SnapshotAPI(TH32CS_SNAPTHREAD, (uint)ProName.Id);
}
catch (Exception hata)
{
System.Windows.Forms.MessageBox.Show("1");
System.Windows.Forms.MessageBox.Show(hata.ToString());
}
THREADENTRY32 te32 = new THREADENTRY32();

ulong size = (ulong)System.Runtime.InteropServices.Marshal.SizeOf(te32);

te32.dwSize = (uint)size;



bool devammi = true;
Stack depo = new Stack();
threadlist = new IntPtr[ProName.Threads.Count];

if (Readerapi.Thread32First(thandle, ref te32))
{
while (devammi)
{
if (te32.th32OwnerProcessID == ProName.Id)
{
IntPtr srhandle = Readerapi.OpenThread(2, false, te32.th32ThreadID);
Readerapi.SuspendThread(srhandle);
threadlist[counter] = srhandle;
counter++;
}
te32.dwSize = (uint)System.Runtime.InteropServices.Marshal.SizeOf(typeof(THREADENTRY32));
devammi = Readerapi.Thread32Next(thandle, ref te32);
}
}
Readerapi.CloseHandle(thandle);
counter = 0;



}

public void Resume(Process ProName)
{
try
{
thandle = Readerapi.CreateToolhelp32SnapshotAPI(TH32CS_SNAPTHREAD, (uint)ProName.Id);
}
catch (Exception hata)
{
System.Windows.Forms.MessageBox.Show("1");
System.Windows.Forms.MessageBox.Show(hata.ToString());
}
THREADENTRY32 te32 = new THREADENTRY32();

ulong size = (ulong)System.Runtime.InteropServices.Marshal.SizeOf(te32);

te32.dwSize = (uint)size;



bool devammi = true;
Stack depo = new Stack();
counter = 0;
if (Readerapi.Thread32First(thandle, ref te32))
{
while (devammi)
{
if (te32.th32OwnerProcessID == ProName.Id)
{

// IntPtr srhandle = Readerapi.OpenThread(2, false, te32.th32ThreadID);
// IntPtr rhandle = depo.Pop();
Readerapi.ResumeThread(threadlist[counter]);
counter++;



}
te32.dwSize = (uint)System.Runtime.InteropServices.Marshal.SizeOf(typeof(THREADENTRY32));
devammi = Readerapi.Thread32Next(thandle, ref te32);
}
}
Readerapi.CloseHandle(thandle);
counter = 0;

}



Aslında açıklanacak bir kaç şey var;

  1. thread32first illa ki boyutun önceden belirtilmesini ister
  2. CreateToolhelp32Snapshot açıklamaları için www.pinvoke.com ya da www.msdn.com'a bakabilirsiniz.
  3. Hani biliyorsunuz ama ben yine de söyleyeyim. Böyle API eklemek için projenin referanslarında "System.Runtime.InteropServices" sınıfı da bulunmalıdır.
  4. Dangıl dungul tanımlanmış böyle bakınca bir şey anlaşılmayan nesneler projede anlamlıdır. Müsterih olunuz hiç birini yersiz yurtsuz koymadık.
  5. Kodlar daha doğrusu bu yolla bir processi suspend/resume etmek çok da güvenli değil. Birbirine bağlı ve düzensiz sıralanmış threadlerin yanlış suspend edilmesi programın kilitlenmesine yol açabilir. Büyük ihtimalle de kaydedilmemiş verileriniz kaybolacaktır. Hihohaha bu son cümleyi hep kullanmak istemiştim. Öylesine mutluyum ki şu an. 
  6. Windows'larda kullanılan API'ler kernel32.dll'de bulunmaktadır ama Win CE falan mobil işlerde toolhelp mi toolhelp32 mi öyle bir kütüphanededir kendileri. THREADENTRY32 yapısı da daha fazla değer alıyordu. 
  7. C++'da mis gibi headeri varmış THREADENTRY32'nin. C#'ta yok öyle bir şey. Orjinalinde Dword olan zamazingoların c# karşılıklarını ayarlamak çok uğraştırdı. 
  8. Suspend/Resume konusunda nette C# için bir makale bulunmuyor. Aslında bir gün üşenmeyip İngilizce güzel bişiler yazsam bu konuda(böyle dandirik değil elbette. hıh!) iyi olacak. 

17 Ocak 2008 Perşembe

LAN IP Kontrolü




Tamamen ihtiyaçtan yazılmış ufak bir network tool. Program LAN'daki szin belirlediğiniz IP'lere yine sizin belirlediğiniz yenileme süresi ile ping atarak varlıklarını denetliyor. Arka planda çalışıyor. Eğer yeni bağlantı varsa size sesli uyarıda bulunuyor.
Bazen zevkine modemin wireless olayını açıyorum. Konu komşu girerse de haberim olsun, bir ARP Poisoning ile ziyaretine gideyim istiyorum. O yüzden yazıldı.
Pek de bir işe yaramıyor yani : )

Kaynak

FOX Decompiler


.NET kodları için şahane bir decompiler var. Adı Fox. Daha doğrusu Xenon Fox. Csharpnedir.com forumlarında başlayan serüveni Amerikan, XENON isimli decompiler ve obfuscator üzerine çalışan firma ile sonuçlanır.
Özcan Değirmenci'nin yazdığı bu programı büyük bir mutlulukla öneririm. .Net'in yapısından dolayı bu compiler gerçekten şahane bir reverse engineering sunuyor ama yanında kod güvenliği hakkında tartışmaları da getiriyor.
Neyse bu işler böyle. Birisi decompile eder, ötekisi obfuscate eder, berikisi deobfuscate... Falan filan. İşin sonu yok : )

Bayanlar baylar karşınızda: FOX Decompiler

Rss ile Proxy Adresleri Alan Program


İşte blog'un adına adresine yaraşır boş beleşlikte bir program.
Hiç bir ske derman olmayan, tasarımdan uzak, kullanıcı dostluğu sıfırın altında.
Kim bilir ne yapmak isterken yarıda kalıp bir köşede unutulmuş, yalnız, üzgün ve düşkün bir uygulama.

Lan demin kodlara baktım da bunu ben yazmamış olabilirim. Harbiden bak; değişken isimleri falan pek benim seçtiğim tarzda değil. Hani yarın birisi gelip de "lan sen benim programımı hem kendine mal etmişsin hem de hakaret etmişsin" demesin. Vallahi söylediğimi geri alırım, tükürdüğümü yalarım. "10 numara yapmışsın ağabey" derim

Kaynak

Free Rss Reader(Feeder)


Xml ve Rss olayını araştırırken yazdığım kör, topal bir program. Çalışıyor ama bir çok eksiği var. Zamanında, simge durumuna küçüldüğünde alttan kaybolup saatin yanına bir icon olarak yerleşme özelliği vardı şimdi çalışmıyor. Aslında buraya yüklemeden önce biraz uğraşıp adam edecektim ama şimdiki cahil dönemimden daha da cahil olduğum bir zaman yazmıştım bunu. Thread falan hak getire. Neyse alın kullanın, kodlamama bakıp gülün ehehe.
Zamanında build, release, publish ne bulursam etmişim klasör 2 mb'a yakın ama basit bir program. Üşendim ayıklamaya.
Program bir kaç haber sitesinden beslenebiliyor. Yanlış hatırlamıyorsam yeni Rss kaynakları da eklenebiliyordu da öyle eklediğinle mi ne kalıyordu hatırlamıyorum. Menülerde var ama eklenmiyor gözüyle bakın siz. Hem kaç tane haber sitesi var orda, napacanız yenisini alim mi olacanız başımıza eheh .
Ama gaza geldim en kısa sürede ciddi bir rss reader programı yazacağım. Söz bak.

Kaynak

XOR Şifreleme


C#'ta basit şifreleme, shifting ve byte bazında işlem olayını öğrenmeye çalışırken yazdığım bir program. Nasıl kullanılacağı Form'da yazıyor. İsteyene kodlarını da gönderebilirim. Yahu niye istenmesini bekliyorum, doğrudan kodlarıyla birlikte proje klasörünü veriyorum. Tepe tepe kullanın.
Pek kullanışlı olmasa da bilgisayarında meraklı gözlerden saklanacak dosyalar için kullanabilirsiniz. Yalnız dikkat etmeniz gerek şey: Dosyayı tekrar decrypt(açarken, çözerken) ederken bu programı ve şifreleme anahtarınızı kullanmanız. Dikkat!


Program: Program

Kaynak: Kaynak

16 Ocak 2008 Çarşamba

Lüzumsuz İşler

Merhaba. Bu blog sayfasında ilgimi çeken konuları, c# ile yazdığım işe yaramaz programları paylaşacağım. Dünya internet alemine hayırlı ve uğurlu olması dileğiyle.