Merhabalar,

    Cl
ipboard hepimizin hergün birçok kere yazı, resim, dosya kopyalayıp yapıştırmak için kullandığımız bir araç. Ben bu makalemde ilk olarak .NET’te Clipboard class’ını kullanarak clipboard’a veri kopyalama ve kopyalanmış olan veriyi okumanın nasıl yapılabileceğini basit bir örnek üzerinden anlatacağım. Ardından ise Win32 fonksiyonları ile bize sunulan Clipboard API’sini kullanarak panoya kopyalanmış olan yazıların görüntülendiği bir uygulama yapacağım.

    İlk olarak Clipboard’da tutulan yazı veya resmi uygulama üstündeki textbox veya picturebox’a yapıştırabileceğimiz ve textbox veya picturebox’daki resmi/yazıyı Clipboard’a kopyalayabileceğimiz uygulamamızı yazalım. Bir Windows uygulaması oluşturup formu aşağıdaki gibi tasarlayalım:



   Formu tasarladıktan sonra ilk önce yazı kopyalama/yapıştırma işlemlerini gerçekleştireceğimiz butonların click event’lerini yazalım:





private void btnYaziyiKopyala_Click(object sender, EventArgs e)
{

    Clipboard
.SetDataObject(txtYapistir.SelectedText, true);
}


private
void btnYaziyiYapistir_Click(object sender, EventArgs e)
{

    IDataObject
dObj = Clipboard.GetDataObject();
    if
(dObj.GetDataPresent(DataFormats.Text))
    {
        txtYapistir.Text = dObj.GetData(DataFormats.Text).ToString();
    }
}

    Görüldüğü gibi Clipboard nesnesinin iki tane önemli öğesi bulunmakta. Bunlardan birincisi olan SetDataObject metodu Clipboard’a veri eklemek için kullanılır. Bu metodun iki tane overload’ı vardır. Birinci overload’ı parametre olarak sadece object tipinde veri alır. Bu Clipboard’a kopyalanacak olan verinin tutulduğu parametredir. Diğer overload’ında ise object parametresinin yanısıra boolean tipinde bir parametre daha vardır. Bu parametrenin değerini true olarak set ettiğimizde uygulama sonlandığı zaman uygulamadan kopyalanmış olan verilerin Clipboard’dan silinmeden tutulmasını sağlarız. Böylece diğer uygulamalar da Clipboard’a kopyalanmış olan bu veriye erişebilirler. Bu parametreyi false olarak set ettiğimizde uygulama sonlanınca uygulama tarafından Clipboard’a kopyalanmış olan veriler de Clipboard’dan silinecektir. Biz kendi uygulamamızda bu parametreyi true olarak set ettik. 

    Clipboard’ın ikinci önemli öğesi olan GetDataObject fonksiyonu da Clipboard’da tutulmakta olan veriye erişebilmemizi sağlar. Bu fonksiyon IDataObject nesnesi döndürür. Fonksiyondan dönen IDataObject nesnesinin GetDataPresent fonksiyonunu kullanarak Clipboard’da tutulan verinin bizim istediğimiz tipte veri olup olmadığını anlayabiliriz. Biz bu örnekte dönen verinin tipi Text ise formumuzdaki textbox’ın Text property’sine yine IDataObject nesnesinin GetData fonksiyonunu kullanarak Clipboard’dan aldığımız veriyi atadık.

    Şimdi de yine benzer şekilde Clipboard’da duran bir resmi formumuz üstündeki picturebox’a atayalım ve formumuzdaki picturebox’da duran resmi Clipboard’a yapıştıralım. Bunun için Resmi Kopyala ve Resmi Yapıştır butonlarının Click eventlerine aşağıdaki kodu yazıyoruz:





private void btnResmiKopyala_Click(object sender, EventArgs e)
{
    Clipboard
.SetDataObject(pbxResim.Image, true);
}

private
void btnResmiYapistir_Click(object sender, EventArgs e)
{
    IDataObject
dObj = Clipboard.GetDataObject();
    if
(dObj.GetDataPresent(DataFormats.Bitmap))
    {
        pbxResim.Image = (Bitmap)dObj.GetData(DataFormats.Bitmap);
        pbxResim.SizeMode = PictureBoxSizeMode.StretchImage;
   
}
}

    Görüldüğü gibi bu örneği bir önceki örnekte yazdığımız kodla aynı mantıkta yazdık. Tek fark Clipboard’ın SetDataObject metodunda Text yerine Image nesnesini gönderdik ve veriyi  Clipboard’dan da okurken IDataObject nesnesinin GetDataPresent ve GetData fonksiyonlarında DataFormats enum’unun Bitmap öğesini parametre olarak gönderdik. Son olarak da formumuz üstündeki picturebox’ın SizeMode property’sini resmin tamamı picturebox’a sığsın diye StretchImage olarak set ettik.

    Uygulamamızda yazacağımız kodları tamamladık, artık çalıştırabiliriz:



    İlk olarak notepad’den kopyaladığım yazıyı uygulamadaki textbox’a Yazıyı Yapıştır butonuna tıklayarak yapıştırdım. Form üstündeki textbox’a birşeyler yazıp Yazıyı Kopyala butonuna basınca da text Clipboard’a kopyalanacaktır. Şimdi de paint’te bir resmi kopyalayıp form üstündeki picturebox’a yapıştıralım:



    Görüldüğü gibi .NET tarafından bize sunulan Clipboard class’ı ile uygulamamız üzerinden kopyalama-yapıştırma işlemlerini idare etmek oldukça kolay bir işlem. Şimdi sırada API yardımıyla Clipboard işlemlerini yapacağımız formumuzu geliştirmek var. Bu formumuz Clipboard’ı dinleyecek ve Clipboard’a bir yazı kopyalandığında formumuz üstündeki textbox’a yazıyı yapıştıracak. İlk olarak basitçe formumuzu aşağıdaki gibi tasarlayalım:



    Bu işlemi gerçekleştirmek için de Win32′nin Clipboard işlemleri için sunduğu SetClipboardViewer, ChangeClipboardChain, SendMessage fonksiyonlarını kullanacağız. Bu fonksiyonları .NET ortamından çağırmak için de DllImport attribute’ını kullanarak fonksiyonları import edeceğiz:






using
System.Runtime.InteropServices;

namespace
ClipboardMakale
{

    public
partial class Form2 : Form
   
{
        [DllImport("User32.dll", CharSet = CharSet.Auto)]

        public
static extern IntPtr SetClipboardViewer(IntPtr hWnd);
       
[DllImport("User32.dll", CharSet = CharSet.Auto)]
        public static extern bool ChangeClipboardChain(IntPtr hWndRemove, IntPtr hWndNewNext);
        [DllImport("user32.dll", CharSet = CharSet.Auto)]

        public
static extern int SendMessage(IntPtr hwnd, int wMsg, IntPtr wParam, IntPtr lParam);


    Ardından ise Clipboard’da tutulan verinin saklanacağı class level bir pointer tanımlayalım:
 




IntPtr SonrakiClipboardOgesi;

    Sonrasında ise formun load’ında SetClipboardViewer fonksiyonunu çağırıyoruz. Bu fonksiyon uygulamamızı Clipboard’ı izleyen uygulamaların listesine ekleyecek:





private void Form2_Load(object sender, EventArgs e)
{
    SonrakiClipboardOgesi = SetClipboardViewer(this.Handle);
}

    Şimdi ise sırada WndProc metodunu override etmek var:





protected override void WndProc(ref Message m)
{
    int
WM_DRAWCLIPBOARD = 0×0308;
    int
WM_CHANGECBCHAIN = 0x030D;

    if
(m.Msg == WM_DRAWCLIPBOARD)
   
{
        ClipboardOku();
        SendMessage(SonrakiClipboardOgesi, m.Msg, m.WParam, m.LParam);
    }
    else
if (m.Msg == WM_CHANGECBCHAIN)
   
{
        if
(m.WParam == SonrakiClipboardOgesi)
        {
            SonrakiClipboardOgesi = m.LParam;
        }
       
else
       
{
            SendMessage(SonrakiClipboardOgesi, m.Msg, m.WParam, m.LParam);
        }
    }
   
    base
.WndProc(ref m);
}

private
void ClipboardOku()
{
    IDataObject
dObj = Clipboard.GetDataObject();
    if
(dObj.GetDataPresent(DataFormats.Text))
    {
        textBox1.Text = (string)dObj.GetData(DataFormats.Text);
    }
}

    Windows, Clipboard’da tutulan veriler değiştiği zamanlarda verinin değiştiğine dair bildirimde bulunulacak olan pencerelerin bir listesini tutar. Ve WM_DRAWCLIPBOARD mesajı da clipboard içeriğini görüntüleyen ilk pencereye gönderilir. Bu, clipboard’ın içeriğini görüntüleyen pencerenin clipboard’daki en güncel içeriği elde etmesini sağlar. Bu içeriği sadece Clipboard içeriği görüntülemeye yetkili olan pencereler elde edebilirler. Biz zaten formumuz yüklenirken SetClipboardViewer fonksiyonunu çağırarak uygulamamıza clipboard içeriğini alabilme yetisini kazandırmıştık. Şimdi de WM_DRAWCLIPBOARD mesajını handle ederek Clipboard içeriğini elde edebiliriz. Kodda görüldüğü üzere pencereye WM_DRAWCLIPBOARD mesajı geldiğinde ilk olarak ClipboardOku metodunda gelen veriyi (Text ise) textbox’a yazdırıyoruz ve ardından SendMessage metodu ile de Clipboard’ı izleyen diğer pencerelere de Clipboard’daki bu değişikliğin yansımasını sağlıyoruz.








    Handle etmemiz gerekecek olan diğer mesaj da WM_CHANGECBCHAIN olacak. Bu mesaj Clipboard’ı izleyen uygulamalardan birisi ortadan kalktığında Clipboard’ı izleyen uygulamalardan ilkine gönderilir. Eğer uygulamamıza WM_CHANGECBCHAIN mesajı gelirse, uygulamamız SendMessage fonksiyonunu kullanarak bu mesajı Clipboard’ı izleyen sıradaki uygulamaya gönderecek. Eğer sıradaki uygulama zincirden kaldırılacak olan uygulama ise SonrakiClipboardOgesi zincirden kaldırılacak olan uygulamadan sonraki ilk uygulamaya atanacak.

    Son olarak bizim uygulamamız sonlanırken yani formun FormClosing event’inde ChangeClipboardChain fonksiyonunu çağırarak uygulamamızı Clipboard’ı izleyen uygulamaların listesinden çıkarıyoruz:
 




private void Form2_FormClosing(object sender, FormClosingEventArgs e)
{
    ChangeClipboardChain(this.Handle, SonrakiClipboardOgesi);
}


    Bu noktadan sonra artık uygulamamız Clipboard’daki değişiklikleri izleyebilecek ve Clipboard’daki herhangi bir değişiklik anında uygulamamıza yansıyacaktır. Örneğin uygulamamızı çalıştırıp notepad’den yazı kopyaladığımızda uygulamamızdaki textbox’da da kopyaladığımız yazıyı görebiliriz. Bu bilgiler ışığında dilerseniz siz de Office uygulamalarında olduğu gibi bilgisayarınızda çalışırken kopyaladığınız metinleri, resimleri saklayıp sonradan kullanabileceğiniz küçük bir uygulama yazabilirsiniz.

    Işıl ORHANEL

    Merhabalar,


    Uygulamalarımızda kullanıcı bazında veya uygulama bazında ayarlar yapmak için Settings class’ını kullanabiliriz. Settings class’ı ile uygulamayı kullanacak olan kişilere uygulamanın bazı özelliklerini kendilerinin belirleyecekleri şekilde kullanmalarına olanak sağlayabilir veya uygulamanın çalışması için gerekli olan bazı değerleri Settings içinde tutarak uygulamadan bu değerlere erişebiliriz. Settings class’ı C#’da Properties namespace’i aldında bulunur ve dört önemli property’e sahiptir. Bunlardan birincisi Name property’sidir. Name property’si uygulamada tutulacak olan ayarın adının belirlendiği ve ilgili ayara değer atarken erişilmesine olanak sağlayan property’dir. İkinci property olan Type ise ayarın alacağı değerin tipinin tutulduğu property’dir. Örneğin string, boolean veya Color. Scope property’si ise User veya Application değerlerinden birini alır. Bir ayarın Scope’ı Application olarak set edilmişse bu ayar uygulamada kullanıcı tercihlerine bağlı olarak kullanıcı tarafından değiştirilemeyen, uygulamanın çalışmasını önemli derecede etkileyen ayardır. Örneğin uygulamanın veritabanının connection string’i. User scope’lı ayarlar ise kullanıcı bazında değişebilen ve uygulamanın çalışması açısından o kadar da önemli olmayan ayarlardır. Örneğin uygulamadaki butonların rengi gibi. Bu iki değer arasında önemli olan bir fark daha bulunmaktadır. User scope’lı ayarlar uygulama çalışırken erişilebilir ve yeniden ayarlanabilir özelliğe sahipken, Application scope’lı ayarlar uygulama çalışırken read-only’dirler. Application scope’lı ayarları sadece designer ekranından veya .settings dosyasını elle değiştirerek değiştirebilirsiniz.


    Şimdi örnek bir uygulamada Settings class’ının kullanımını inceleyelim. Uygulamamızda Settings class’ı yardımıyla form text’i, arkaplan rengi gibi bazı ayarları nasıl oluşturabileceğimizi inceleyeceğiz. İlk olarak yeni bir Windows uygulaması oluşturalım. Oluşturduğumuz uygulamada set edeceğimiz ayarlar aşağıdaki gibi olacak:
- Form text’i
- Form arkaplan rengi
- Uygulamanın açılış sesi
- Formun maximize edilip edilemeyeceği

    Bu ayarların hepsine bir ad, alacağı değerin tipi ve ayarın scope’ını belirleyeceğimiz .settings dosyasını açıyoruz ve yukarıda belirtilen öğeleri designer ekranından giriyoruz:



    Uygulamamız açılırken çalmasını istediğimiz .wav dosyasının lokasyonunu string tipinde AcilisSesi property’sinde tutacağız. Formun arkaplan rengini Color tipinde FormArkaplanRenk property’sinde, text’ini FormText property’sinde tutacağız. Son olarak formun maximize edilip edilemeyeceğini de boolean tipinde MaximizeEnabled property’sinde tutacağız. Bütün property’lerin Scope’larını User olarak belirleyip Value’larını boş bırakalım.
Sıra uygulamamızın ekranlarını tasarlamaya geldi. Uygulamamızda iki adet form olacak,  bunlardan birincisi set edilmiş ayarların gösterileceği ana ekran ve diğeri de ayarları set edebileceğimiz ayarlar ekranı olacak. Ana ekranı aşağıdaki gibi tasarlayalım:



    Bu formdaki MenuStrip öğelerinden Ayarlar’a tıklandığında ayarlar ekranı açılacak, Ayarları Yükle’ye basıldığında ise ayarlar ekranında set edilmiş olan ayarların güncel hali yüklenecek. Ayarları yapacağımız ikinci ekranı ise aşağıdaki gibi tasarlayalım:



    Şimdi ilk olarak Ayarlar ekranının kodunu yazmaya başlayalım. Arkaplan rengini belirlemek için formumuza bir ColorDialog kontrolü ekliyoruz ve Arkaplan Rengi label’ının hizasında olan butonun click event’ine aşağıdaki kodu yazıyoruz:





private void btnOpenColorDialog_Click(object sender, EventArgs e)
{
    colorDialog1.ShowDialog();
    lblArkaplanDeger.BackColor = colorDialog1.Color;
}


    Butonun click event’inde color dialog’u açıyor ve seçilen rengi fomdaki label’ın arkaplan rengi property’sine atıyoruz. Sırada uygulama açıldığı zaman çalacak olan .wav dosyasının belirlenmesi var. Bunun için de formumuza Açılış Sesi label’ının hizasında olan butona tıklandığında açılacak olan bir OpenFileDialog nesnesi ekliyoruz ve butonun Click event’ine aşağıdaki kodu yazıyoruz:






private void btnPickAcilisSesi_Click(object sender, EventArgs e)
{
    openFileDialog1.ShowDialog();
    lblAcilisSesiDeger.Text = openFileDialog1.FileName.Substring(openFileDialog1.FileName.LastIndexOf(@”\”) + 1);
    lblAcilisSesiDeger.Tag = openFileDialog1.FileName;
}


    Ayarlara atanacak değerler için yazmamız gereken başka bir kod kalmadığına göre artık ayarları kaydetme aşamasına gelebiliriz. Kaydet butonunun click event’ine aşağıdaki kodu yazıyoruz:






private void btnKaydet_Click(object sender, EventArgs e)
{
    Settings.Default.AcilisSesi = lblAcilisSesiDeger.Tag.ToString();
    Settings
.Default.FormArkaplanRenk = lblArkaplanDeger.BackColor;
    Settings
.Default.FormText = txtFormTextDeger.Text;
    Settings
.Default.MaximizeEnabled = chkMaximizeEnabled.Checked;
    Settings
.Default.Save();
    this
.Close();
}





    Butonun click event’inde tek yapmamız gereken bu property’lere formun üstündeki kontrollerin değerlerini atamak. AcilisSesi property’sine label’ın tag’ına atadığımız değeri, FormArkaplanRenk property’sine lblArkaplanDeger label’ının BackColor property’sinin değerini, FormText property’sine textbox’da yazan yazıyı ve MaximizeEnabled property’sine de checkbox’ın değerini atıyoruz. Ardından da Settings nesnesinin Save metodunu çağırarak ayarları kaydediyoruz ve Ayarlar formunu kapatıyoruz.

    Son olarak Ayarlar formu yüklendiği zaman mevcut ayarların görüntülenmesi için formun Load’ına aşağıdaki kodu yazalım:





private void frmAyarlar_Load(object sender, EventArgs e)
{
    lblAcilisSesiDeger.Text = Settings.Default.AcilisSesi.Substring(Settings.Default.AcilisSesi.LastIndexOf(@”\”) + 1);
    lblAcilisSesiDeger.Tag = Settings.Default.AcilisSesi;
    lblArkaplanDeger.BackColor = Settings.Default.FormArkaplanRenk;
    txtFormTextDeger.Text = Settings.Default.FormText;
    chkMaximizeEnabled.Checked = Settings.Default.MaximizeEnabled;
}


    Yukarıda görüldüğü gibi biraz önceki işlemin tam tersini yapıyoruz ve form üstündeki kontrollere mevcut ayarların değerlerini atıyoruz. Ayarlar ekranında yazmamız gereken kodlar bunlardan ibaret. Şimdi uygulamanın ana ekranına geçelim. Bu ekran yüklenirken yani uygulama başlatıldığında formun yüklenmiş ayarlarla beraber açılması gerekiyor. Bu yüzden formun Load’ında settings dosyasından alınan değerleri formun text’ine, arkaplanına vs atayacağız:






private void Form1_Load(object sender, EventArgs e)
{
   
SoundPlayer sp = new SoundPlayer();
    sp.SoundLocation = Settings.Default.AcilisSesi;
    sp.Play();
    this
.BackColor = Settings.Default.FormArkaplanRenk;
    this
.Text = Settings.Default.FormText;
    this
.MaximizeBox = Settings.Default.MaximizeEnabled;
}


    Settings’de tutulan property’lerin değerlerini okuyarak form açılırken AcilisSesi property’sinde belirlenmiş olan .wav dosyasının çalınmasını, FormArkaplanRenk property’sinde belirlenmiş olan rengin arkaplan rengi olarak atanmasını, FormText property’sinde belirlenmiş olan yazının formun text’ine atanmasını ve MaximizeEnabled property’sindeki değere bağlı olarak da formun maximize edilip edilemeyeceğini sağlamış olduk. Şimdi formdaki iki menustrip öğesine tıklandığında çalışacak olan kodu yazalım:






private void ayarlarToolStripMenuItem_Click(object sender, EventArgs e)
{
    frmAyarlar
f = new frmAyarlar();
    f.ShowDialog();
}

private
void ayarlarıYükleToolStripMenuItem_Click(object sender, EventArgs e)
{
    this.BackColor = Settings.Default.FormArkaplanRenk;
    this
.Text = Settings.Default.FormText;
    this
.MaximizeBox = Settings.Default.MaximizeEnabled;
}


    Ayarlar’a tıklandığında Ayarlar ekranı açılacak ve Ayarları Yükle’ye tıklandığında ise Settings nesnesinde tutulan ayarlar form’un property’lerine tekrar yüklenecek ve ekran en güncel haliyle görüntülenecek. Uygulamamızı çalıştırıp ayarları aşağıda görüldüğü gibi set edelim:



    Kaydet butonuna basıp ayarları kaydedelim ve ana ekranda Ayarları Yükle’ye basalım. Formun arkaplan rengi, text’i ve maximize butonu bizim belirlediğimiz şekilde yüklenecektir:



    Uygulamayı kapatıp yeniden çalıştırdığımızda ise açılışta çalmasını istediğimiz .wav dosyası çalacaktır.

    Bu makalemde Settings class’ı yardımıyla uygulamamızda ayar oluşturmaktan bahsettim. Faydalı olmasını umarım.

    Işıl ORHANEL

    Merhabalar,


    System.Media namespace’i ses dosyalarını çalmamızı ve işletim sisteminde default olarak bulunan ses dosyalarına erişmemizi sağlar. System.Media namespace’i üç class’tan oluşur. Bunlardan birincisi SoundPlayer class’ıdır. SoundPlayer class’ı bize .wav dosyalarını çalmamıza olanak sağlayan class’tır. İkinci class olan SystemSound class’ı işletim sisteminde yüklü olan sesleri çalmamızı sağlar. Sonuncu class olan SystemSounds class’ı ise Windows’daki belli event’ler sonucu çalan seslere erişim sağlar.


    Bu makalemde .wav dosyalarını çalmamızı sağlayan SoundPlayer class’ı üzerinde duracağız. SoundPlayer class’ı System.Media namespace’i altında yeralır ve aşağıdaki öğelerden meydana gelmiştir:



SoundPlayer class’ında bulunan bu öğelerin açıklamaları aşağıdaki gibidir:



















Property‘ler
IsLoadCompleted (bool) .wav dosyasının başarıyla yüklenip yüklenmediğinin tutulduğu property’dir.
LoadTimeout (int) .wav dosyasının yüklenmesi gereken sürenin milisaniye cinsinden tutulduğu property’dir. Default değeri 10000′dir (10 saniye).
SoundLocation (string) .wav dosyasının path’inin tutulduğu property’dir.
Stream (Stream) .wav dosyasının yükleneceği Stream’in tutulduğu property’dir.
Tag (object) System.Media.SoundPlayer hakkında verinin tutulduğu property’dir.


 
























Method’lar
Load .wav dosyasını yükler.
LoadAsync .wav dosyasını bir stream’den veya web kaynağından yeni bir thread’de yükler.
Play .wav dosyasını çalar, eğer daha önceden yüklenmemişse önce dosyayı yükler.
PlayLooping .wav dosyasını sürekli olarak çalar, eğer daha önceden yüklenmişse önce dosyayı yükler.
PlaySync .wav dosyasını mevcut thread’de çalar, eğer daha önceden yüklenmemişse önce dosyayı yükler.
Stop .wav dosyasının çalınmasını durdurur.


 















Event’ler
LoadCompleted .wav dosyası başarılı veya başarısız bir şekilde yüklendiğinde tetiklenir.
SoundLocationChanged SoundPlayer nesnesinin SoundLocation property’sine yeni bir değer atandığında tetiklenir.
StreamChanged SoundPlayer nesnesinin Stream property’sine yeni bir değer atandığında tetiklenir.


    Yukarıda listelenmiş olan property, metod, event’ler yardımıyla uygulamalarımızda istediğimiz zamanlarda .wav dosyalarını çalabiliriz. Şimdi örnek bir uygulamada SoundPlayer nesnesinin bu öğelerini inceleyelim.


    Uygulamamız bir windows uygulaması olacak ve açılışta belirlemiş olduğumuz .wav dosyasını çalacak, formun üstündeki butonlar yardımıyla da yüklediğimiz .wav dosyasında Play, Stop, PlayLooping metodlarını çalıştıracağız. İlk olarak formumuzu aşağıdaki gibi tasarlayalım:



İlk olarak kodumun using statement’ları arasına System.Media’yı ekleyelim:





using System.Media;


    Şimdi uygulamamız açıldığında bir .wav dosyasının çalınmasını sağlayalım.Bunun için uygulamamızın Settings dosyasına AcilisSesi adında string tipinde bir property ekliyoruz. Değerine ise projemizin debug klasörünün altında yeralan Wavs klasöründeki CHIMES.WAV dosyasını atıyoruz:



    Sırada formun load’ında Chimes.wav dosyasını çaldırmak var:
 




private void frmSoundPlayer_Load(object sender, EventArgs e)
{
    System.Media.SoundPlayer sp = new SoundPlayer();
    sp.SoundLocation = Settings.Default.AcilisSesi;
    sp.Play();
}


    Kodda SoundPlayer class’ının bir instance’ını aldık ve SoundLocation property’sine Settings dosyasındaki AcilisSesi property’sinin değerini atadık. Ardından da SoundPlayer nesnesinin Play metodu ile .wav dosyasını çaldırdık.


    Şimdi kullanıcının çalmak istediği .wav dosyasını açmak için kullanacağı .wav dosyası aç butonunun click event’ine aşağıdaki kodu yazalım:







private void btnOpenSound_Click(object sender, EventArgs e)
{
    lblWavName.Text = “”;
    ofdSound.Filter = “.wav dosyaları|*.wav|Tüm Dosyalar|*.*”;
    ofdSound.ShowDialog();
    lblWavName.Text = ofdSound.FileName;
}


    Butona tıkladığımız zaman formumuza eklediğimiz OpenFileDialog (ofdSound) ile .wav dosyasının adını formumuzdaki label’a (lblWavName) atıyoruz. Çal, Durdur ve Loop buton’larının click event’lerinde bu label’daki değeri okuyarak SoundPlayer’ın SoundLocation property’sine atayacağız.


    Dosyanın adını da aldıktan sonra Çal ve Loop buton’larının kodlarını yazabiliriz:
 




private void btnPlay_Click(object sender, EventArgs e)
{
    if
(lblWavName.Text != “” && lblWavName.Text.ToLower().IndexOf(“.wav”) > 0)
    {
        SoundPlayer
sp = new SoundPlayer();
        sp.SoundLocation = lblWavName.Text;
        sp.Play();
    }
}

private
void btnLoop_Click(object sender, EventArgs e)
{
    if (lblWavName.Text != “” && lblWavName.Text.ToLower().IndexOf(“.wav”) > 0)
    {
        SoundPlayer
sp = new SoundPlayer();
        sp.SoundLocation = lblWavName.Text;
        sp.PlayLooping();
    }
}


    Çal ve Loop butonlarının click event’lerinde SoundPlayer nesnesinin instance’ını aldıktan sonra SoundLocation property’sine lblWavName’de yazan değeri atadık. Ardından da çal butonu için Play, Loop butonu için de PlayLooping metodlarını çağırdık. Son olarak sıra Durdur butonunun click event’ini yazmaya geldi. Burada da SoundPlayer nesnesinin Stop metodunu çağırarak çalmakta olan .wav dosyasını durdurabiliriz:
 




private void btnStop_Click(object sender, EventArgs e)
{
    SoundPlayer
sp = new SoundPlayer();
    sp.Stop();           
}


    Görüldüğü gibi System.Media namespace’i altında yeralan SoundPlayer nesnesi ile uygulamalarımıza .wav dosyalarını çalma özelliğini eklemek son derece kolay. Geliştirdiğimiz uygulamalarımızda kullanıcı uygulamayı ilk çalıştırdığında, uygulamadan çıkarken, bazı işlemleri yaparken gibi durumlarda bazı .wav dosyalarını çalarak uygulamamıza ek özellikler katabiliriz.

Işıl ORHANEL

Windows işletim sistemlerinde uygulama ve veri yönetiminin sağlanması, sistem bileşenlerinin kontrol edilmesi ve izlenmesi için geliştirilmiş olan WMI mimarisi ve .NET ile belirtilen işlemlerin yapılabilmesini sağlayan System.Management namespace’i hakkında yazdığım dökümanı aşağıdaki linkten indirebilirsiniz.

WMI_Ve_SystemManagement