Makale Özeti

Windows Live Messenger'ın 8 versiyonuyla gelen bir yenilik olan add-in desteği sayesinde artık biz de kendi add-in'lerimizi yazıp Messenger'da dilediğimiz gibi kullanabileceğiz. Bu makalemde MessengerClient.dll'ini kullanarak nasıl add-in'lerin nasıl oluşturulabileceğinden bahsedeceğim.

Makale

Merhabalar,

        Windows Live Messenger'ın 8 versiyonuyla gelen bir yenilik olan add-in desteği sayesinde artık biz de kendi add-in'lerimizi yazıp Messenger'da dilediğimiz gibi kullanabileceğiz. Bu makalemde MessengerClient.dll'ini kullanarak nasıl add-in'lerin nasıl oluşturulabileceğinden bahsedeceğim.

        Windows Live Messenger'da add-in desteği default olarak görüntülenmiyor. Bunun için öncelikle add-in eklememizi-çıkarmamızı sağlayacak olan özelliği registry'de ayarları değiştirerek aktif hale getirmemiz gerekmekte. Bunun için registry'de HKEY_CURRENT_USER\Software\Microsoft\MSNMessenger altına AddInFeatureEnabled adında yeni bir DWORD değeri eklememiz ve değerini 1 olarak kaydetmemiz gerek:

Registry'de bu ayarı yaptıktan sonra artık Messenger'da Tools-Options ekranında aşağıdaki gibi Add-ins sekmesini görebiliyor olmanız gerekir:

Bu ekranı add-in'imizi yazdıktan sonra Messenger'a eklemek için kullanıyor olacağız.

İlk olarak MessengerClient kütüphanesindeki belli başlı öğeler ve ne işe yaradıkları hakkında bilgi verip, ardından örnek kodlarla add-in'imizi oluşturacağım.

Messenger Client kütüphanesi aşağıda görüldüğü gibi AddInProperties, IncomingTextMessageEventArgs, MessengerClient, OutgoingTextMessageEventArgs, StatusChangedEventArgs ve User class'larından oluşmaktadır.

AddInProperties class'ı aşağıdaki öğelerden oluşur:

Creator(String) Add-in'i oluşturan kişi veye şirket bilgisi  
Description(String) Add-in'in ne işe yaradığı gibi açıklama bilgileri.
FriendlyName(String) Add-in'in adı.
PersonalStatusMessage(String) Messenger kullanıcısının kişisel ileti mesajı
Url(Uri) Add-in i yazan kişi veya şirketin internet adresi
UserTile(Image) Messenger kullanıcısının görüntü resmi


MessengerClient class'ı aşağıdaki öğelerden oluşur:

AddInProperties(AddInProperties)   Çalışan add-in'in özelliklerini taşıyan AddInProperties objesi.
LocalUser(User) Add-in'i çalıştıran kullanıcının özelliklerini taşıyan User nesnesi
SendActionMessage Kullanıcının nudge göndermesini sağlayan metod
SendTextMessage Kullanıcının text mesajı göndermesini sağlayan metod
IncomingTextMessage Mesaj alındığında kullanılabilecek event.
OutgoingTextMessage Mesaj gönderilirken kullanılabilecek event
ShowOptionsDialog Handle edildiği zaman Messenger'ın add-in penceresindeki Settings ile ulaşılabilecek ayarların yapılmasını sağlayan event
Shutdown Add-in kapatılırken kullanılabilecek event.
StatusChanged Kullanıcının veya kontaklarından birinin status'u değiştiğinde kullanılabilecek event.


IncomingTextMessageEventArgs class'ı aşağıdaki öğelerden oluşur:

TextMessage(string) Mesajın text'i.
UserFrom(User) Mesajı gönderen kişinin özelliklerini taşıyan User nesnesi.

OutgoingTextMessageEventArgs class'ı aşağıdaki öğelerden oluşur:

TextMessage(string) Mesajın text'i
UserTo(User) Mesaj gönderilecek kişinin özelliklerini taşıyan User nesnesi.

StatusChangedEventArgs class'ı aşağıdaki öğelerden oluşur:

User(User) Online, busy gibi kullanıcı status'u değişen kullanıcının özelliklerini taşıyan User nesnesi.
GetGroupNames(String[]) User nesnesinin dahil olduğu grupları getiren metod.
Email(string) User nesnesinin e-mail adresi
FriendlyName(string) User nesnesinin kullanıcı ismi.
PersonalStatusMessage(string) User nesnesinin görüntü mesajı.
Status(UserStatus) User nesnesinin durumu.
UniqueId(string) Kullanıcının tekil bir değişkeni

UserStatus ise online, busy, away gibi kullanıcı statuslarını taşıyan enum'dur.

Şimdi sıra bu incelediğimiz konuları daha pratik bir şekilde görebilmemiz için projemizi oluşturup, add-in'imizi yazmaya geldi. İlk olarak yeni bir Class Library projesi oluşturuyoruz ve projemize Program Files\MSN Messenger altında bulunan MessengerClient.dll'inin referansını veriyoruz:



Bu adımda önemli bir noktaya değinmek gerek. Projemizin assembly name'ini assembly.info dosyasından class'ın fully qualified adı şeklinde belirtmeliyiz. Aksi taktirde add-in'i messenger'a eklemeye çalıştığımızda aşağıdaki hata ile karşılaşmamız olasıdır:



Örnek projemizde namespace ve class'larımız MsgrAddIn adına sahipler. Bu yüzden assembly name'i MsgrAddIn.MsgrAddIn şeklinde olmak zorundadır.



Sırada Microsoft.Messenger namespace'ini classımıza using ile tanımlamak ve IMessengerAddIn interface'ini implement etmek var:
 

using Microsoft.Messenger; //!

namespace MsgrAddIn


        class
MsgrAddIn : IMessengerAddIn
       
{
            MessengerClient
_msnClient = null;

             #region IMessengerAddIn Members

             public void Initialize(MessengerClient messenger)
            {
                _msnClient = messenger;
            }

             #endregion
       
}
}

    Artık yarattığımız add-in'e çeşitli özellikler ve fonksiyonlar kazandırabiliriz. Öncelikle add-in'in bazı özelliklerini set etmemizi sağlayacak kodu Initialize metodunun içine yazalım:

     public void Initialize(MessengerClient messenger)
    {
        _msnClient = messenger;
        _msnClient.AddInProperties.Creator = "IsilOrhanel";
        _msnClient.AddInProperties.Description = "Messenger AddIn";
        _msnClient.AddInProperties.FriendlyName = "MsgrAddIn";
        _msnClient.AddInProperties.PersonalStatusMessage = "Ilk Add-In Olusmaya Basladi...:)";
        _msnClient.AddInProperties.Status = UserStatus.Busy;
    }

    Bu kod bloğunda add-in çalıştığı anda kullanıcının kişisel iletisi Ilk Add-In Olusmaya Basladi...:) ve durumu meşgul olacak şekilde değişecektir.



Bu pencereden MsgrAddIn.MsgrAddIn dll'ini seçtikten sonra add-ins penceresinde yazmış olduğumuz add-in seçili hale gelir:



Add-in'i ekledikten sonra aktif hale geçmesi için menüde yeralan Turn on "MsgrAddIn" seçeneğini işaretlemeliyiz.


 


Artık oluşturduğumuz add-in sorunsuz bir şekilde çalışmaya başlayacaktır ve Add-in aktif durumdayken ileti pencerelerinde aşağıdaki mesaj görüntülenir:



Şimdi de bazı örneklerle MessengerClient nesnesinin event'lerini inceleyelim. İlk olarak örneğin StatusChanged event'inde hangi kullanıcının saat kaçta hangi status'a geçtiğini messagebox'ta gösteren kodu yazalım. Initialize metodunun içinde aşağıdaki kodu ekleyelim:

    public void Initialize(MessengerClient messenger)
    {
        _msnClient = messenger;
        _msnClient.StatusChanged += new EventHandler<StatusChangedEventArgs>(_msnClient_StatusChanged);
    }

Ardından da event handler içine aşağıdaki kodu yazalım:

    void _msnClient_StatusChanged(object sender, StatusChangedEventArgs e)
    {
        MessageBox
.Show("Saat: " + DateTime.Now + " / Kullanici: " +  e.User.FriendlyName + " / Status: " +  e.User.Status.ToString() + " olarak değişti.");
    }

Kodu derleyip çalıştırdıktan sonra listemizdeki kişilerin durumu ve kendi durumumuz değiştikçe aşağıda görüldüğü gibi messagebox'lar çıkacaktır:




Şimdi de listemizdeki kişilerden mesaj aldığımızda kullanabileceğimiz IncomingTextMessage event'i ile ilgili bir örnek yapalım. Eğer durumumuz OutToLunch ise add-in'imiz mesaj gönderen kişiye titreşim ve öğle yemeğindeyim mesajı göndersin. Bunun için yine ilk olarak add-in'in Initialize metoduna aşağıdaki kodu ekleyeceğiz:

  public void Initialize(MessengerClient messenger)
    {
        _msnClient = messenger;
        _msnClient.IncomingTextMessage += new
EventHandler<IncomingTextMessageEventArgs>(_msnClient_IncomingTextMessage);   
    }


Sonrasında ise metodda aşağıdaki kodu kullanacağız:

void _msnClient_IncomingTextMessage(object sender, IncomingTextMessageEventArgs e)
    {
        if
(_msnClient.LocalUser.Status == UserStatus.OutToLunch)
        {
            string
outToLunchMessage = "Öğle yemeğindeyim.....:)";
            _msnClient.SendNudgeMessage(e.UserFrom);
            _msnClient.SendTextMessage(outToLunchMessage, e.UserFrom);
        }
    }

Add-in'i çalıştırıp durumumuzu OutToLunch olarak set edersek, bize bir mesaj geldiğinde add'inimiz devreye girecek ve titreşim ve mesajı gönderecektir:



Şimdi ise OutgoingTextMessage event'ini kullanarak üst üste mesaj gönderip gönderilmediğini denetleyen bir örnek yazalım. İlk olarak Initialize metoduna aşağıdaki kodu ekleyeceğiz:

  public void Initialize(MessengerClient messenger)
    {
        _msnClient = messenger;
        msnClient.OutgoingTextMessage += new EventHandler<OutgoingTextMessageEventArgs>(_msnClient_OutgoingTextMessage);
    }

Ardından da metoda aşağıdaki kodu yazacağız:

_ Hashtable ht = new Hashtable();

void _msnClient_OutgoingTextMessage(object sender, OutgoingTextMessageEventArgs e)
    {
        if
(ht.ContainsKey(e.UserTo.Email) && e.TextMessage == ht[e.UserTo.Email].ToString())
        {
            if
(MessageBox.Show("Bir önce yazdığın mesajı tekrar göndermek istediğine emin misin?", "Uyarı", MessageBoxButtons.YesNo)==DialogResult.No)
            {
                e.Cancel = true;
                return
;
            }
        }
        if
(ht.ContainsKey(e.UserTo.Email))
        {
            ht[e.UserTo.Email] = e.TextMessage;
        }
        else

        {
            ht.Add(e.UserTo.Email, e.TextMessage);
        }
    }

Yukarıdaki kod bir hashtable'da mesaj gönderilen kişinin e-mail adresini ve gönderilen mesajı saklıyor ve her mesaj gönderildiğinde gönderilen mesaj text'ini bir önceki mesaj text'i ile değiştiriyor. Böylece kullanıcı üst üste iki kere aynı mesajı yazıp gönderdiğinde kullanıcıyı uyarıyor:

Biz hayıra basıp mesaj gönderme işlemini iptal edersek ileti penceresinde aşağıdaki şekilde bir mesaj görürüz:

Son olarak add-in'imizde çeşitli ayarlamaları yapabileceğimiz bir form oluşturalım. Örnek olarak kullanıcının status'u away olduğu zaman listesindeki kişilerden mesaj geldiğinde otomatik cevap verecek olan away mesajının set edilmesini sağlayalım. İlk olarak add-in projemize yeni bir Windows formu ekleyelim ve forma textbox ve buton koyalım:



Formun arkasina aşağıdaki kodu yazalım:

    public partial class frmAddInSetting : Form
   
{
        public
frmAddInSetting()
        {
            InitializeComponent();
        }
        private
string _message; //string turunde bir degisken tanimliyoruz..
       
public string message
        {
            get
{ return _message; }
            set
{ _message = value; }
        }
        private
void btnOK_Click(object sender, EventArgs e)
        {
            this
._message = txtMessage.Text; //.. ve degiskene textbox'daki degeri atiyoruz.
           
this.DialogResult = DialogResult.OK;
        }
    }

Şimdi sıra add-in'imizin ayarlar penceresi açıldığında nasıl davranacağını yazacağımız koda geldi. Yine Initialize metoduna aşağıdaki kodu ekliyoruz:

  public void Initialize(MessengerClient messenger)
    {
        _msnClient = messenger;
        _msnClient.ShowOptionsDialog += new EventHandler(_msnClient_ShowOptionsDialog);
    }

ShowOptionsDialog metodunda ise aşağıdaki gibi kod oluşturuyoruz.

   
string AwayMessage = "";
    void
_msnClient_ShowOptionsDialog(object sender, EventArgs e)
    {
        frmAddInSetting
settings = new frmAddInSetting(); //yeni olusturdugumuz formun instance'ini aliyoruz
       
if (settings.ShowDialog() == DialogResult.OK)
        {
            AwayMessage = settings.message; //class level tanimlamis oldugumuz degiskene formdan gelen string degiskenin degerini atiyoruz.
       
}
    }

Artık messenger'ın add-in eklememizi sağlayan ekranından add-in ayarlarına tıkladığımızda yeni oluşturduğumuz form açılacaktır ve textbox'a yazdığımız mesaj away durumuna geçtiğimizde set edilecek olan mesaj olacaktır.

 

Son adımda ise add-in'in IncomingTextMessage metoduna aşağıdaki kodu yazdığımızda away durumuna geçtiğimizde bize mesaj gönderen kişilere otomatik olarak add-in'in ayarlarında yazmış olduğumuz text'in gitmesini sağlayacak kodu yazalım:

   
void _msnClient_IncomingTextMessage(object sender, IncomingTextMessageEventArgs e)
    {
        if
(_msnClient.LocalUser.Status == UserStatus.Away)
        {
            _msnClient.SendTextMessage(AwayMessage, e.UserFrom);
        }
    }

Artık biz away durumundayken mesaj geldiği zaman messenger aşağıdaki gibi davranacaktır:



Makalemin ilk bölümünün sonunda add-in yazarken karşılaşma olasılığınızın çok yüksek olduğu bir hata mesajından bahsetmek istiyorum. Eğer yazmış olduğunuz add-in messenger'ınızda çalışıyorken siz mevcut add-in'de bir değişiklik yapıp tekrar derlemeye çalışırsanız aşağıdaki hata ile karşılaşabilirsiniz:

"Unable to copy file "obj\Debug\MsgrAddIn.MsgrAddIn.dll" to "bin\Debug\MsgrAddIn.MsgrAddIn.dll". The process cannot access the file 'bin\Debug\MsgrAddIn.MsgrAddIn.dll' because it is being used by another process."

Bu hatayı aldığınızda yapılacak şey messenger'ı kapatmak ve kodu derledikten sonra messenger'ı tekrar açmak olacaktır. Derlemiş olduğunuz dll'in yeni halini ekleyip, add-in'i aktif hale getirdikten sonra da add-in'iniz sorunsuz çalışıyor olacaktır.

Bu makalemde Messenger.Client nesnesi ile Messenger'da yapabileceğimiz şeylere bazı örnekler verdim.
Her ne kadar bazı zamanlarda dll ile yapmak istediğiniz şeyler sınırlansa da messenger'a fonksiyonalite katması açısından başka şeyler de yapılabileceğine inanıyorum ve bunları ilerleyen zamanlarda başka makalelerimde sizlerle paylaşıyor olacağım. Son olarak makalemi yazarken ve kodu test ederken mesaj gönderme, status değiştirme gibi işlemleri her rica edişimde bıkmadan yapan ve yardımlarını esirgemeyen Tamer Öz'e teşekkür ederim.

Işıl ORHANEL

Ornek Kodlar