Makale Özeti

Bu makalemizin konusu Windows XP işletim sistemimizin masaüstü duvarkagıdını, C# ile nasıl kodlayarak değiştirebilecegimizdir. Windows API(Application Programming Interface) 'lerini kullanmanın ne kadar kolay oldugunu göreceksiniz. Yanlızca bu makalede BMP uzantılı dosyalar ile degil diger formatlardaki resimlerinde nasıl duvarkagıdı yapıldıgını görecegiz.

Makale

Özet   : Bu makalemizin konusu Windows XP işletim sistemimizin masaüstü duvarkagıdını, C# ile nasıl kodlayarak değiştirebilecegimizdir. Windows API(Application Programming Interface) 'lerini kullanmanın ne kadar kolay oldugunu göreceksiniz. Yanlızca bu makalede BMP uzantılı dosyalar ile degil diger formatlardaki resimlerinde nasıl duvarkagıdı yapıldıgını görecegiz.

Başlık : C# ile WinXP duvarkagıdını degiştirmek (API kullanımı)

    Tekrardan merhabalar, bu makalemizde son derece basit bir konuya değinecegiz, bir çok kullanıcının masaüstünü daha eglenceli ve güzel hale getirmek için kullandıgı duvar kagıtlarını windowsa bırakmadan nasıl kendimiz kod ile değiştirebiliriz onu inceliyecegiz. Burdaki kısa kodlar üzerinde biraz degişiklikler yaparak belli zaman aralıklarında otomatik degişir bir hale getirebiliriz, veya belirli bir günde kendi seçtimiz bir duvarkagıdı ile makinamızın açılmasını saglayabiliriz.

    Yani hayal gücünüzde sınırlı, hatta bir çok PC kullanıcısının kullandıgı WebShots a bile taş çıkaracak şeyler üretmek mümkün. İlk olarak şunu bilmemiz gerekiyor, Windows duvarkagıdı olarak yanlızca BMP resimlerini destekliyor, yani kullandıgımız Windows APIsi yanlızca BMP dosyaları parametre alıyır, diger formattaki resimleri ise, biraz sonra göreceginiz gibi Windows geçici olarak BMP uzantısına çeviriyor ve öyle görüntülüyor. Bizde aynı işlemi uygulayacagız, yani BMP uzatılı olmayan dosyalari alıp, BMP haline çevirecegiz, sonra kullanacagız.

    Ben ilk olarak şöyle bir form tasarladım, hangi resimi duvarkagıdı yapacagımızı biliyorsak, textboxa yazcaz bilmiyorsak bir openFileDialog ile kullanıcıdan yerini göstermesini isteyecegiz.

    Dosyanın yerini btn_bul'a tıklanınca aşagıdaki gibi  alıyoruz.

openFileDialog1.InitialDirectory = @"c:\";
this.openFileDialog1.Filter = "Resim Dosyaları(*.bmp)|*.bmp| (*.jpg)|*.jpg| (*.gif)|*.gif";

    Koddanda anlaşılacagı gibi başlangıc dizini olarak c: gösterdik ve FileDialogun bize yanlızca .bmp, .jpg ve .gif uzantılı olan dosyaları göstermesini istedik. Dialog geldikten sonra seçimini yapan kişi "OK" tıklar ve artık biz hangi dosyayı, masaüstünde göstericegiz biliyoruzdur,

//dosya seçildi
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
//global degişkenimize dosyanin adını ve yolunu alıyorz
dosyamiz = openFileDialog1.FileName;
//textboxumuzda gösteriyoruz
txt_adres.Text=dosyamiz;
//eger bi JPG, BMP veya GIF uzantılı isee
if (dosyamiz.EndsWith (".jpg")||dosyamiz.EndsWith (".gif"))
{
//BMP formatında saklıyoruz
//yeni dosyayı eski resimin oldugu klasorde saklıyorz
Bitmap yeniresim = new Bitmap(dosyamiz);
yeniresim .Save (System.IO.Directory.GetCurrentDirectory() + @"\yeni_arkaplan.bmp", System.Drawing.Imaging.ImageFormat.Bmp);
//yeni göstericegimiz dosya buuu
dosyamiz = System.IO.Directory.GetCurrentDirectory() + @"\yeni_arkaplan.bmp";

}


    Kodda da belirtigim gibi ilk önce dosyayın yolunu ögreniyoruz, daha sonra uzantısı BMPden farklı ise onu BMP ye çeviriyoruz ve farklı kaydediyoruz. Daha sonra hedef dosyamız bu yeni BMP uzantılı(yeni_arkaplan.bmp)dosyamız oluyor. Yukarıdaki kodlar
btn_bul_Click eventi idi.

    Şimdi sıra asıl önemli konuya geldi, bu BMP resmini nasıl masaüstüne koycaz? Bu işi bir Windows APIsi ile windowsa devredicegiz, bizim adımıza bu işi user32.dll yapacak. Bu dll'i kullana bilmek için import etmemiz gerekmekte, gerekli parametrelerle birlikte kendi namespacemizde bu dll'i kullanabilmek için aşagıdaki kodu ekliyoruz, unutmadan System.Runtime.InteropServices uzayismini ilk olarak eklemeyi unutmayınız;

public class WinAPI
{
[DllImport("user32.dll", CharSet=CharSet.Auto)]
public static extern int SystemParametersInfo (int uAction , int uParam , string lpvParam , int fuWinIni) ;
public const int SPI_SETDESKWALLPAPER = 20;
public const int SPIF_SENDCHANGE = 0x2;
}

 

    WinAPI adinda bir class oluşturduk ve SystemParametersInfo methodu ile gerekli argumentleri yolluyacagız. SPI_SETDESKWALLPAPER ve SPIF_SENDCHANGE ile default sabitleri yolluyacagız. lpvParam dosyamizin yolu ve uAction a yolladıgımız emir belli SPI_SETDESKWALLPAPER. Uygun fonksiyon parameterlerini yolladiktan sonra masaüstü resmimizi user32.dll degiştirecek. Bu DLL'lerin procedurleri her zaman karmaşıktır, ve bir çogu C ile yazılmıştır. 32 uzantısı 32bitlik oldugunu gösteriyor yani bir DOS APIsi degil. Bütün APIler şu 3 Library ile üretilmiştir, şöyle sıralayabiliriz;

- Kernel ("KERNEL32.DLL", işletim sistemi çekirdegi)
                - Fiziksel ve Sanal Hafıza Yönetimi
                - İçerik Değiştokuşu (Context switching)
                - Process yükleme.
                - Dosya Okuma/Yazma


- User ("USER32.DLL" kullanıcı arabirimlerini yönetir)
                - Pencereler
                - Menuler, TextBoxlar, Dialog Kutuları
                - İconlar


- GDI (
"GDI32.DLL" (Graphical Device Interface) Grafik çıktı kütüphanesi)
                - Grafikleri saklar (Makalemizde Bitmape cevirme işlemi gibi, Bitmap üretebilir)
                - Grafik Çıktılar üretir

    Değiştir butonunun click eventi aşagıda;

private void btn_degistir_Click(object sender, System.EventArgs e)
{
WinAPI.SystemParametersInfo(WinAPI.SPI_SETDESKWALLPAPER,1,dosyamiz,WinAPI.SPIF_SENDCHANGE);
}

    İşte bütün hepsi bu kadar, klasik yoldan degilde ben kendi yolumdan gidecegim diyorsanız ve masaüstü arkaplan resminizi degiştirmek için daha kolay bir yol arıyorsanız, eminim uygulamamız hoşunuza gidecektir.

    Çalışmalarınızda bol başarılar ve bol getiriler dilegiyle, kolay gelsin...

Kaynak Kodlar