Winamp Class |
Description: | |
This class provides a thin wrapper around many of the WM_WA_IPC functions. Use with caution. 7/12/1999: Added the command button messages. 12/10/2000: Added PressButton, which exposes more WinAmp functionality. 5/7/2004: Updated the Playlist functions to deal with changes in recent WinAmp versions. | |
Code: | |
'---------------------------------------------------------------------- ' Start: clsWinamp Option Explicit Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _ (ByVal lpClassName As String, ByVal lpWindowName As String) As Long Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" _ (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, _ lParam As Any) As Long Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" _ (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, _ lParam As Any) As Long Private Declare Function PostMessageLng Lib "user32" Alias "PostMessageA" _ (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, _ ByVal lParam As Long) As Long Private Const WM_COMMAND = &H111 Private Const WM_COPYDATA = &H4A Private Const WINAMP_BUTTON1 = 40044 Private Const WINAMP_BUTTON2 = 40045 Private Const WINAMP_BUTTON3 = 40046 Private Const WINAMP_BUTTON4 = 40047 Private Const WINAMP_BUTTON5 = 40048 Private Const WM_USER = &H400 Private Const WM_WA_IPC = WM_USER Private Const IPC_GETVERSION = 0 Private Const IPC_PLAYFILE = 100 Private Const IPC_DELETE = 101 Private Const IPC_STARTPLAY = 102 Private Const IPC_CHDIR = 103 Private Const IPC_ISPLAYING = 104 Private Const IPC_GETOUTPUTTIME = 105 Private Const IPC_JUMPTOTIME = 106 Private Const IPC_WRITEPLAYLIST = 120 Private Type COPYDATASTRUCT dwData As Long cbData As Long lpData As Long End Type Public Enum enumPlay playPlaying = 1 playPaused = 3 playStoped = 0 End Enum Public Enum enumButtons PreviousTrackButton = 40044 NextTrackButton = 40048 PlayButton = 40045 PauseUnpauseButton = 40046 StopButton = 40047 StopAfterCurrentTrack = 40147 FadeoutAndStop = 40157 FastForward5Seconds = 40148 FastRewind5Seconds = 40144 StartOfPlaylist = 40154 GoToEndOfPlaylist = 40158 OpenFileDialog = 40029 OpenUrlDialog = 40155 OpenFileInfoBox = 40188 SetTimeDisplayModeToElapsed = 40037 SetTimeDisplayModeToRemaining = 40038 TogglePreferencesScreen = 40012 OpenVisualizationOptions = 40190 OpenVisualizationPlugInOptions = 40191 ExecuteCurrentVisualizationPlugIn = 40192 ToggleAboutBox = 40041 ToggleTitleAutoscrolling = 40189 ToggleAlwaysOnTop = 40019 ToggleWindowshade = 40064 TogglePlaylistWindowshade = 40266 ToggleDoublesizeMode = 40165 ToggleEq = 40036 TogglePlaylistEditor = 40040 ToggleMainWindowVisible = 40258 ToggleMinibrowser = 40298 ToggleEasymove = 40186 RaiseVolumeBy1Perc = 40058 LowerVolumeBy1Perc = 40059 ToggleRepeat = 40022 ToggleShuffle = 40023 OpenJumpToTimeDialog = 40193 OpenJumpToFileDialog = 40194 OpenSkinSelector = 40219 ConfigureCurrentVisualizationPlugIn = 40221 ReloadTheCurrentSkin = 40291 CloseWinamp = 40001 MovesBack10TracksInPlaylist = 40197 ShowTheEditBookmarks = 40320 AddsCurrentTrackAsABookmark = 40321 PlayAudioCd = 40323 LoadAPresetFromEq = 40253 SaveAPresetToEqf = 40254 OpensLoadPresetsDialog = 40172 OpensAutoLoadPresetsDialog = 40173 LoadDefaultPreset = 40174 OpensSavePresetDialog = 40175 OpensAutoLoadSavePreset = 40176 OpensDeletePresetDialog = 40178 OpensDeleteAnAutoLoadPresetDialog = 40180 End Enum Private m_sWinampDir As String Private m_cPlaylist As Collection Private Function WAWin() As Long WAWin = FindWindow("Winamp v1.x", vbNullString) Debug.Assert WAWin <> 0 End Function Public Property Get Version() As Long Version = SendMessage(WAWin, WM_WA_IPC, 0, ByVal IPC_GETVERSION) End Property Public Sub AddPlaylist(ByVal sFile As String) Dim hWnd As Long hWnd = WAWin If Version > &H1700 Then Dim cds As COPYDATASTRUCT Dim sFileAscii As String sFileAscii = StrConv(sFile, vbFromUnicode) cds.dwData = IPC_PLAYFILE cds.lpData = StrPtr(sFileAscii) cds.cbData = Len(sFile) + 1 SendMessage hWnd, WM_COPYDATA, 0, ByVal VarPtr(cds) Else sFile = sFile & vbNullChar While sFile <> "" PostMessageLng hWnd, WM_WA_IPC, Asc(Mid(sFile, 1, 1)), IPC_PLAYFILE sFile = Mid(sFile, 2) Wend End If End Sub Private Sub AddPlaylist2(Filename As String) End Sub Public Sub DeletePlaylist() PostMessage WAWin, WM_WA_IPC, 0, ByVal IPC_DELETE End Sub Public Sub StartPlay() PostMessage WAWin, WM_WA_IPC, 0, ByVal IPC_STARTPLAY End Sub Public Sub ChDir(ByVal sDir As String) Dim hWnd As Long hWnd = WAWin sDir = sDir & vbNullChar While sDir <> "" PostMessage hWnd, WM_WA_IPC, Asc(Mid(sDir, 1, 1)), _ ByVal IPC_CHDIR sDir = Mid(sDir, 2) Wend End Sub Public Property Get IsPlaying() As enumPlay IsPlaying = SendMessage(WAWin, WM_WA_IPC, 0, ByVal IPC_ISPLAYING) End Property Public Property Get SongPos() As Long SongPos = SendMessage(WAWin, WM_WA_IPC, 0, ByVal IPC_GETOUTPUTTIME) End Property Public Property Get SongLen() As Long SongLen = SendMessage(WAWin, WM_WA_IPC, 1, ByVal IPC_GETOUTPUTTIME) End Property Public Sub JumpToTime(ByVal nTime As Long) PostMessage WAWin, WM_WA_IPC, nTime, ByVal IPC_JUMPTOTIME End Sub Public Property Get WinampDir() As String WinampDir = m_sWinampDir End Property Public Property Let WinampDir(sNew As String) m_sWinampDir = sNew End Property Public Function RefreshPlaylist() As Long RefreshPlaylist = SendMessage(WAWin, WM_WA_IPC, 0, _ ByVal IPC_WRITEPLAYLIST) Dim nFile As Byte Dim sLine As String nFile = FreeFile Open m_sWinampDir & "\winamp.m3u" For Input As #nFile Do While m_cPlaylist.Count > 0 m_cPlaylist.Remove 1 Loop While Not EOF(nFile) Line Input #nFile, sLine m_cPlaylist.Add sLine Wend Close #nFile End Function Public Function PlaylistCount() As Long PlaylistCount = m_cPlaylist.Count End Function Public Function PlaylistSong(nIndex As Long) As String Debug.Assert nIndex >= 1 Debug.Assert nIndex <= m_cPlaylist.Count PlaylistSong = m_cPlaylist(nIndex) End Function Private Sub Class_Initialize() Set m_cPlaylist = New Collection m_sWinampDir = "c:\program files\winamp\" End Sub Public Sub CommandPrevSong() SendMessage WAWin, WM_COMMAND, WINAMP_BUTTON1, ByVal 0 End Sub Public Sub CommandPlay() SendMessage WAWin, WM_COMMAND, WINAMP_BUTTON2, ByVal 0 End Sub Public Sub CommandPause() SendMessage WAWin, WM_COMMAND, WINAMP_BUTTON3, ByVal 0 End Sub Public Sub CommandStop() SendMessage WAWin, WM_COMMAND, WINAMP_BUTTON4, ByVal 0 End Sub Public Sub CommandNextSong() SendMessage WAWin, WM_COMMAND, WINAMP_BUTTON5, ByVal 0 End Sub Public Sub PressButton(buttonNum As enumButtons) SendMessage WAWin, WM_COMMAND, buttonNum, ByVal 0 End Sub ' End: clsWinamp '---------------------------------------------------------------------- | |
Sample Usage: | |
Dim WA As New clsWinamp Dim nSong As Long Debug.Print "Winamp version: " & Hex(WA.Version) WA.AddPlaylist "C:\Mp3's\Superman.mp3" WA.StartPlay nSong = WA.RefreshPlaylist Debug.Print "Current Song: " & WA.PlaylistSong(nSong) |