' Spotify API V0.01 beta - a very quick First draft
' Allows Spotify to be controlled by another app.
' © August 3 2009 by Steffest
' This code is free to use in any way you want and comes with NO WARRANTIES
' tested with Spotify 0.3.18

' Usage
:

' Dim spotify As New spotify()

' spotify.PlayPause()
' spotify.PlayPrev()
' spotify.PlayNext()
' spotify.Mute()
' spotify.VolumeUp()
' spotify.VolumeDown()
' spotify.Nowplaying() (Gets the current playing track)
' spotify.Search("Artist",False) (Searches for "Artist")
' spotify.Search("Artist",True) (Searches for "Artist" and starts playing the results)


Public Class spotify

#Region " win32 "
    Private Declare Auto Function FindWindow Lib "user32" (ByVal lpClassName As String, ByVal lpWindowName As String) As IntPtr
    
Private Declare Auto Function SendMessage Lib "user32" (ByVal hWnd As IntPtr, ByVal Msg As UInteger, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As IntPtr
    
Private Declare Auto Function SetForegroundWindow Lib "user32" (ByVal hWnd As IntPtr) As Boolean
    Private Declare Auto Function keybd_event Lib "user32" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Integer, ByVal dwExtraInfo As Integer) As Boolean
    Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
    
Private Declare Auto Function GetWindowText Lib "user32" (ByVal hwnd As IntPtr, ByVal lpString As String, ByVal cch As IntPtr) As IntPtr
    
Private Declare Auto Function SetWindowText Lib "user32" (ByVal hwnd As IntPtr, ByVal lpString As String) As Boolean
    Private Declare Auto Function EnumChildWindows Lib "user32" (ByVal hWndParent As Long, ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long
#End
Region

#Region
" constants "
    Private Const WM_KEYDOWN = &H100
    
Private Const WM_KEYUP = &H101
    
Private Const WM_MOUSEACTIVATE = &H21
    
Private Const KEYEVENTF_EXTENDEDKEY As Integer = &H1S
    
Private Const KEYEVENTF_KEYUP As Integer = &H2S
#End Region

    Private w As Integer

    Public Sub New()
        w = FindWindow(
"SpotifyMainWindow", vbNullString)
    
End Sub

    Public Function PlayPause() As Boolean
        SendMessage(w, WM_KEYDOWN, Keys.Space, 0)
        SendMessage(w, WM_KEYUP, Keys.Space, 0)
    
End Function

    Public Function PlayPrev() As Boolean
        ' for some reason the PostMessage(w, WM_KEYDOWN, Keys.MediaNextTrack, 0) doesn't work
        ' sending ctrl+ commands to a windows still is a PITA ...
        SetForegroundWindow(w)
        keybd_event(Keys.ControlKey, &H1D, 0, 0)
        keybd_event(Keys.Left, &H45S, KEYEVENTF_EXTENDEDKEY
Or 0, 0)
        keybd_event(Keys.Left, &H45S, KEYEVENTF_EXTENDEDKEY
Or KEYEVENTF_KEYUP, 0)
        Sleep(100)
' wait until spotify has trapped the control key before releasing it
        keybd_event(Keys.ControlKey, &H1D, KEYEVENTF_KEYUP, 0)
    
End Function

    Public Function PlayNext() As Boolean
        SetForegroundWindow(w)
        keybd_event(Keys.ControlKey, &H1D, 0, 0)
        keybd_event(Keys.Right, &H45S, KEYEVENTF_EXTENDEDKEY
Or 0, 0)
        keybd_event(Keys.Right, &H45S, KEYEVENTF_EXTENDEDKEY
Or KEYEVENTF_KEYUP, 0)
        Sleep(100)
' wait until spotify has trapped the control key before releasing it
        keybd_event(Keys.ControlKey, &H1D, KEYEVENTF_KEYUP, 0)
    
End Function

    Public Function VolumeUp() As Boolean
        SetForegroundWindow(w)
        keybd_event(Keys.ControlKey, &H1D, 0, 0)
        keybd_event(Keys.Up, &H45S, KEYEVENTF_EXTENDEDKEY
Or 0, 0)
        keybd_event(Keys.Up, &H45S, KEYEVENTF_EXTENDEDKEY
Or KEYEVENTF_KEYUP, 0)
        Sleep(100)
' wait until spotify has trapped the control key before releasing it
        keybd_event(Keys.ControlKey, &H1D, KEYEVENTF_KEYUP, 0)
    
End Function

    Public Function Mute() As Boolean
        SetForegroundWindow(w)
        keybd_event(Keys.ControlKey, &H1D, 0, 0)
        keybd_event(Keys.ShiftKey, &H1D, 0, 0)
        keybd_event(Keys.Down, &H45S, KEYEVENTF_EXTENDEDKEY
Or 0, 0)
        keybd_event(Keys.Down, &H45S, KEYEVENTF_EXTENDEDKEY
Or KEYEVENTF_KEYUP, 0)
        Sleep(100)
' wait until spotify has trapped the control key before releasing it
        keybd_event(Keys.ShiftKey, &H1D, KEYEVENTF_KEYUP, 0)
        keybd_event(Keys.ControlKey, &H1D, KEYEVENTF_KEYUP, 0)
    
End Function

    Public Function VolumeDown() As Boolean
        SetForegroundWindow(w)
        keybd_event(Keys.ControlKey, &H1D, 0, 0)
        keybd_event(Keys.Down, &H45S, KEYEVENTF_EXTENDEDKEY
Or 0, 0)
        keybd_event(Keys.Down, &H45S, KEYEVENTF_EXTENDEDKEY
Or KEYEVENTF_KEYUP, 0)
        Sleep(100)
' wait until spotify has trapped the control key before releasing it
        keybd_event(Keys.ControlKey, &H1D, KEYEVENTF_KEYUP, 0)
    
End Function

    Public Function Nowplaying() As String
        Dim lpText As String
        lpText = New String(Chr(0), 100)
        
Dim intLength As Integer = GetWindowText(w, lpText, lpText.Length)
        
If (intLength <= 0) OrElse (intLength > lpText.Length) Then Return "Unknown"
        Dim strTitle As String = lpText.Substring(0, intLength)
        strTitle = Mid(strTitle, 11)
        
Return strTitle
    
End Function

    Public Function Search(ByVal s As String, ByVal AndPlay As Boolean) As Boolean
        SetForegroundWindow(w)
        keybd_event(Keys.ControlKey, &H1D, 0, 0)
        keybd_event(Keys.L, &H45S, KEYEVENTF_EXTENDEDKEY
Or 0, 0)
        keybd_event(Keys.L, &H45S, KEYEVENTF_EXTENDEDKEY
Or KEYEVENTF_KEYUP, 0)
        Sleep(100)
' wait until spotify has trapped the control key before releasing it
        keybd_event(Keys.ControlKey, &H1D, KEYEVENTF_KEYUP, 0)

        SendKeys.SendWait(s & Chr(13))

        
If AndPlay Then
            ' this is a bit stupid but works in this version: press tab twice, then enter
            Sleep(100)
            SendKeys.SendWait(Chr(9) & Chr(9) & Chr(13))
        
End If

    End Function

End
Class