VB - Windows Live Messenger "Now Playing"

By , 4/8/2008
(1 ratings)
This class allows you to send a string to Windows Live Messenger to let other users see what you are just listening, like Windows Media Player.
Imports System.Runtime.InteropServices

Public Class MSNStatusMessage
    Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" ( _
        ByVal hWnd1 As Integer, _
        ByVal hWnd2 As Integer, _
        ByVal lpsz1 As String, _
        ByVal lpsz2 As String) _
    As Integer

    Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" ( _
        ByVal Hwnd As Integer, _
        ByVal wMsg As Integer, _
        ByVal wParam As Integer, _
        ByVal lParam As Integer) _
    As Integer

    Private Const WM_COPYDATA As Short = 74

    Private Structure COPYDATASTRUCT
        Public dwData As Integer
        Public cbData As Integer
        Public lpData As Integer
    End Structure

    Public Enum EnumCategory As Integer
        Music = 0
        Games = 1
        Office = 2
    End Enum

    Public Shared Sub SendStatusMessage(ByVal Enable As Boolean, ByVal Category As EnumCategory, Optional ByVal Message As String = "")
        Dim Data As COPYDATASTRUCT
        Dim Buffer As String = "\0" & Category.ToString + "\0" & IIf(Enable, "1", "0") & "\0{0}\0" & Message & "\0\0\0\0" & Chr(0) & ""
        Dim Handle As Integer = 0

        Data.dwData = 1351
        Data.lpData = VarPtr(Buffer)
        Data.cbData = Buffer.Length * 2

        Handle = FindWindowEx(0, Handle, "MsnMsgrUIManager", Nothing)

        If Handle > 0 Then
            SendMessage(Handle, WM_COPYDATA, 0, VarPtr(Data))
        End If
    End Sub

    Private Shared Function VarPtr(ByVal e As Object) As Integer
        Dim GC As GCHandle = GCHandle.Alloc(e, GCHandleType.Pinned)
        Dim GC2 As Integer = GC.AddrOfPinnedObject.ToInt32
        GC.Free()
        Return GC2
    End Function
End Class

Tagged with msn, wlm, api.

3 Comments

By Scottcohen, 2/25/2009
I have a question for you, what can I use to include a second part.
Currently, when I use this snippet, it changes my Now Playing string to "Message - ".

When I change the buffer to:
[code=VB.NET]Dim Buffer As String = "\0" & Category.ToString + "\0" & IIf(Enable, "1", "0") & "\0{0}\0" & Message & "\0" & Message2 & "\0" & Chr(0) & ""[/code]
The following happens:
- In the main contacts screen, it displays perfectly ("Message - Message2")
- In the chat screen, it ONLY displays the first (without a dash!) ("Message")

Do you know how I can change the buffer, so that it changes the string in the main contacts screen AND in the chat screen?

Many thanks!
By Scottcohen, 2/25/2009
You can mail me:
mikesmith13321
[AT]
gmail
[DOT]
com
By Scottcohen, 2/25/2009
Already solved it: change {0} to {0} - {1}
 

Log in, to comment!

Related Snippets