MSN Messenger 7 beta build 0604 sürümünün adresini bir önceki yazımda vermiş ve bir ekran görüntüsü paylaşmıştım. Bu sürüm Windows Media Player'da çalan şarkının adını isminizin sonuna şu şekilde ekliyor.
MSN7'nin bu sürümünü bana haber veren arkadaşım (Şaban Özgür), bu seferde bir winamp için bir plugin bulduğunu ve çalmakta olan şarkıyı MSN7'de nickname sonuna eklediğini söyledi. Kendisi biraz reverse engineering den anlar. ;) Biraz uğraş sonunda pluginlerin mesajları SendMessage ile MSN'e gönderdiğini anladık. (İlgili araçlar için Google'a exescope, w32dasm diye sorunuz.) Ardından kendisi plugini mesajları MSN'in MsnMsgrUIManager classname ine sahip penceresi yerine bizim yazdığımız uygulamalara gönderme işlemini halletti.:) Gelen mesajları yakalayıp, mesajın hangi format ile gönderildiğini kavradıktan sonra sıra geldi aynı format ile mesajları kendi uygulamamızdan göndermeye. Pinvoke severlere bu işlemler sırasında kulladığım yardımcı bir araç olan
Api Viewer uygulamasını tavsiye ederim.
Daha sonra bu özelliği daha önce yazdığım WinampSongName.NET uygulamasına entegre ederek son halini vermiş oldum:)
Zip içindeki dosyalar:
MSN7Lib.vb: Esas oğlan budur. Olay burada bitiyor.
Form1.vb: Daha önce yazdığım uygulamada da olan bu form şarkı adı değiştikçe MSNde nickinizin sonuna şarkı ve şarkıcı adını ekliyor.
Form3.vb: MSN7Lib'in testi için kullanabilirsiniz. Textboxlara gireceğiniz değerleri şarkı adı olarak ayarlar.Şekilde Gözüktüğü gibi:

Class1.vb ve Form2.vb: Bunlar başlangıçta uygulamamıza gelen mesajları yakaladığımız ve çeşitli taklalar attığım dosyalardır. Programın çalışması için gerekli değillerdir. Kendisine gelen WM_COPYDATA mesajlarını yakalayıp Form2 de görüntülemektedir. İncelemek isterseniz.
Ne oldu şimdi? -Eğlendik:) Ve güzel bir Windows Api uygulaması elde etmiş olduk.
Şaban Özgür ile gecenin köründe yazdığımız bu güzide "Coding for Fun" uygulamasını buradan indirebilirsiniz.
Esas Oğlan'dan alıntı (MSN7Lib)
Public Sub ChangeListeningText(ByVal songname As String, ByVal artist As String, ByVal album As String, ByVal handle As IntPtr)
Dim data(684) As Byte
data(0) = 1
Array.Copy(getBytes(songname), 0, data, 4, getBytes(songname).Length)
Array.Copy(getBytes(artist), 0, data, 204, getBytes(artist).Length)
Array.Copy(getBytes(album), 0, data, 304, getBytes(album).Length)
Array.Copy(getBytes("Cengiz HAN"), 0, data, 304, getBytes("Cengiz HAN").Length)
Dim hwnd As IntPtr = FindWindow("MsnMsgrUIManager", Nothing)
Dim x As IntPtr = Runtime.InteropServices.Marshal.AllocCoTaskMem(Runtime.InteropServices.Marshal.SizeOf(GetType(WinampSongName.NET.COPYDATASTRUCT)))
Dim cs As New COPYDATASTRUCT
cs.dwData = New IntPtr(1351)
cs.cbData = 684
cs.lpData = Runtime.InteropServices.Marshal.UnsafeAddrOfPinnedArrayElement(data, 0)
Runtime.InteropServices.Marshal.StructureToPtr(cs, x, True)
SendMessage(hwnd.ToInt64, WM_COPYDATA, handle, x)
End Sub