|
Imports System.Runtime.InteropServices
Public Class cAMP
Private Declare Function FindWindow Lib "user32.dll" Alias _
"FindWindowA" (ByVal lpClassName As String, _
ByVal lpWindowName As String) As Int32
Private Declare Function GetWindowText Lib "user32.dll" Alias _
"GetWindowTextA" (ByVal hWnd As IntPtr, _
ByVal lpString As String, ByVal cch As Int32) As Int32
Private Declare Function SendMessage Lib "user32.dll" Alias _
"SendMessageA" (ByVal hWnd As IntPtr, _
ByVal wMsg As Int32, ByVal wParam As Int32, _
ByVal lParam As Int32) As Int32
Private Const WM_USER As Int32 = &H400
Private Const WM_COMMAND As Int32 = &H111
Private Const WM_COPYDATA As Int32 = &H4A
Private Const WM_WA_IPC = WM_USER
Private iHandle As IntPtr = IntPtr.Zero
Private Enum WA_IPC
GETVERSION = 0
PLAYFILE = 100
DELETE = 101
STARTPLAY = 102
ISPLAYING = 104
GETOUTPUTTIME = 105
JUMPTOTIME = 106
WRITEPLAYLIST = 120
SETPLAYLISTPOS = 121
SETVOLUME = 122
SETPANNING = 123
GETLISTLENGTH = 124
GETLISTPOS = 125
GETINFO = 126
GETEQDATA = 127
SETEQDATA = 128
RESTARTWINAMP = 135
INETAVAILABLE = 242
UPDTITLE = 243
REFRESHPLCACHE = 247
GET_SHUFFLE = 250
GET_REPEAT = 251
SET_SHUFFLE = 252
SET_REPEAT = 253
GETWND = 260
ISWNDVISIBLE = 261
End Enum
Private Enum WA_IPC_CMDS
VolumeUp = 40058
VolumeDown = 40059
Forward5S = 40060
Rewind5S = 40061
GoPrevious = 40044
DoStart = 40045
DoPause = 40046
DoStop = 40047
GoNext = 40048
DoFadeout = 40147
FastForward = 40148
FastRewind = 40144
ShowOpenFile = 40029
ShowOpenURL = 40155
JumpToFirstTrack = 40154
JumpToLastTrack = 40158
End Enum
Public Enum WA_Window
WA_Equalizer = 0
WA_PlaylistEditor = 1
WA_Medialibrary = 2
WA_Video = 3
End Enum
Public Enum WA_EQ_Band
Band_1 = 0
Band_2 = 1
Band_3 = 2
Band_4 = 3
Band_5 = 4
Band_6 = 5
Band_7 = 6
Band_8 = 7
Band_9 = 8
Band_10 = 9
Band_Preamp = 10
End Enum
Public Enum WA_PlayState
Playing = 1
Paused = 3
Stopped = 0
End Enum
Public Overrides Function toString() As String
If Me.WindowHandle <> 0 Then
Return Me.SongTitle()
Else
Return "AMP"
End If
End Function
Public ReadOnly Property Status() As WA_PlayState
Get
Return SendMessage(iHandle, WM_WA_IPC, 0, WA_IPC.ISPLAYING)
End Get
End Property
Public WriteOnly Property Volume() As Byte
Set(ByVal value As Byte)
SendMessage(iHandle, WM_WA_IPC, value, WA_IPC.SETVOLUME)
End Set
End Property
Public WriteOnly Property Panning() As Byte
Set(ByVal value As Byte)
SendMessage(iHandle, WM_WA_IPC, value, WA_IPC.SETPANNING)
End Set
End Property
Public ReadOnly Property TrackCount() As Int32
Get
Return SendMessage(iHandle, WM_WA_IPC, 0, _
WA_IPC.GETLISTLENGTH)
End Get
End Property
Public Property TrackNumber() As Int32
Get
Return SendMessage(iHandle, WM_WA_IPC, 0, WA_IPC.GETLISTPOS)
End Get
Set(ByVal value As Int32)
SendMessage(iHandle, WM_WA_IPC, value, WA_IPC.SETPLAYLISTPOS)
End Set
End Property
Public ReadOnly Property TrackLength() As Int32
Get
Return SendMessage(iHandle, WM_WA_IPC, 1, _
WA_IPC.GETOUTPUTTIME)
End Get
End Property
Public Property Position() As Int32
Get
Return SendMessage(iHandle, WM_WA_IPC, 0, _
WA_IPC.GETOUTPUTTIME)
End Get
Set(ByVal value As Int32)
Dim i As Int32
i = SendMessage(iHandle, WM_WA_IPC, value, WA_IPC.JUMPTOTIME)
'0 = Okay
If i = -1 Then
Throw New Exception("Cannot set position. _
WinAMP ist not playing")
ElseIf i = 1 Then
Throw New Exception("Cannot set position. EOF reached.")
End If
End Set
End Property
Public ReadOnly Property SampleRate() As Int32
Get
Return SendMessage(iHandle, WM_WA_IPC, 0, WA_IPC.GETINFO)
End Get
End Property
Public ReadOnly Property Bitrate() As Int32
Get
Return SendMessage(iHandle, WM_WA_IPC, 1, WA_IPC.GETINFO)
End Get
End Property
Public ReadOnly Property Version() As Int32
Get
Return SendMessage(iHandle, WM_WA_IPC, 0, WA_IPC.GETVERSION)
End Get
End Property
'Video Eigenschaften - erst ab Version 5 abrufbar
Public ReadOnly Property VideoWidth() As Short
Get
Dim i As Int32
i = SendMessage(iHandle, WM_WA_IPC, 3, WA_IPC.GETINFO)
Return LowWord(i)
End Get
End Property
Public ReadOnly Property VideoHeight() As Short
Get
Dim i As Int32
i = SendMessage(iHandle, WM_WA_IPC, 3, WA_IPC.GETINFO)
Return HighWord(i)
End Get
End Property
Public ReadOnly Property HasInternetAccess() As Boolean
Get
Return (SendMessage(iHandle, WM_WA_IPC, 0,
WA_IPC.INETAVAILABLE) = 1)
End Get
End Property
Public ReadOnly Property WindowHandle() As Int32
Get
Return iHandle.ToInt32
End Get
End Property
Public Property Shuffle() As Boolean
Get
Return (SendMessage(iHandle, WM_WA_IPC, 0, _
WA_IPC.GET_SHUFFLE) = 1)
End Get
Set(ByVal value As Boolean)
If value Then
SendMessage(iHandle, WM_WA_IPC, 1, WA_IPC.SET_SHUFFLE)
Else
SendMessage(iHandle, WM_WA_IPC, 0, WA_IPC.SET_SHUFFLE)
End If
End Set
End Property
Public Property Repeat() As Boolean
Get
Return (SendMessage(iHandle, WM_WA_IPC, 0, _
WA_IPC.GET_REPEAT) = 1)
End Get
Set(ByVal value As Boolean)
If value Then
SendMessage(iHandle, WM_WA_IPC, 1, WA_IPC.SET_REPEAT)
Else
SendMessage(iHandle, WM_WA_IPC, 0, WA_IPC.SET_REPEAT)
End If
End Set
End Property
Public Property EqualizerBand(ByVal iBand As WA_EQ_Band) As Short
Get
Return SendMessage(iHandle, WM_WA_IPC, iBand, _
WA_IPC.GETEQDATA)
End Get
Set(ByVal value As Short)
'0=-20db 63=20db
If value >= 0 And value <= 63 Then
SendMessage(iHandle, WM_WA_IPC, value, WA_IPC.SETEQDATA)
Else
Throw New Exception("Invalid equalizer value.")
End If
End Set
End Property
Public Sub New()
Me.RefreshHandle()
End Sub
'Playlist nach <winamp_pfad>\Winamp.m3u sichern und aktuelle _
position zurückgeben
Public Function WritePlaylist() As Int32
Return SendMessage(iHandle, WM_WA_IPC, 0, WA_IPC.WRITEPLAYLIST)
End Function
Public Function RefreshHandle() As Boolean
iHandle = FindWindow("Winamp v1.x", vbNullString)
Return Not iHandle.Equals(IntPtr.Zero)
End Function
Public Sub ClearPlaylist()
SendMessage(iHandle, WM_WA_IPC, 0, WA_IPC.DELETE)
End Sub
Public Function GetWindowHandle(ByVal wawReq As WA_Window) -
As Int32
Return SendMessage(iHandle, WM_WA_IPC, wawReq, WA_IPC.GETWND)
End Function
Public Function IsWindowVisible(ByVal wawReq As WA_Window) _
As Boolean
Return SendMessage(iHandle, WM_WA_IPC, wawReq, _
WA_IPC.ISWNDVISIBLE)
End Function
Public Sub RefreshTitleInformation()
SendMessage(iHandle, WM_WA_IPC, 0, WA_IPC.UPDTITLE)
End Sub
Public Sub Restart()
SendMessage(iHandle, WM_WA_IPC, 0, WA_IPC.RESTARTWINAMP)
End Sub
Public Function SongTitle() As String
Dim strResult As String = New String(Chr(0), 255)
Dim iTextLength As Int32 = -1
iTextLength = GetWindowText(iHandle, strResult, -
strResult.Length)
If iTextLength <= 0 Or iTextLength > strResult.Length Then
strResult = ""
Else
strResult = strResult.Trim()
strResult = strResult.Trim(Chr(0))
If strResult.EndsWith(" - Winamp") Then
strResult = strResult.Remove(strResult.Length - 9)
End If
If strResult.Contains(".") Then
If strResult.IndexOf("."c) < strResult.IndexOf(" "c) Then
If IsNumeric(strResult.Substring(0, _
strResult.IndexOf("."c))) Then
strResult = strResult.Remove(0, _
strResult.IndexOf(".") + 2)
End If
End If
End If
If strResult.StartsWith("[ICY 401") Then strResult = ""
End If
Return strResult
End Function
Public Function StatusText(ByVal waState As WA_PlayState) _
As String
Select Case waState
Case WA_PlayState.Paused : Return "Paused"
Case WA_PlayState.Playing : Return "Playing"
Case WA_PlayState.Stopped : Return "Stopped"
Case Else : Return "Unknown"
End Select
End Function
'5 Sekunden vor
Public Sub ForwardShort()
SendMessage(iHandle, WM_COMMAND, WA_IPC_CMDS.Forward5S, 0)
End Sub
'5 Sekunden zurück
Public Sub RewindShort()
SendMessage(iHandle, WM_COMMAND, WA_IPC_CMDS.Rewind5S, 0)
End Sub
Public Sub VolumeRaise()
SendMessage(iHandle, WM_COMMAND, WA_IPC_CMDS.VolumeUp, 0)
End Sub
Public Sub FastRewind()
SendMessage(iHandle, WM_COMMAND, WA_IPC_CMDS.FastRewind, 0)
End Sub
Public Sub JumpToFirstTrack()
SendMessage(iHandle, WM_COMMAND, _
WA_IPC_CMDS.JumpToFirstTrack, 0)
End Sub
Public Sub JumpToLastTrack()
SendMessage(iHandle, WM_COMMAND, _
WA_IPC_CMDS.JumpToLastTrack, 0)
End Sub
Public Sub ShowOpenFileDialog()
SendMessage(iHandle, WM_COMMAND, WA_IPC_CMDS.ShowOpenFile, 0)
End Sub
Public Sub ShowOpenURLDialog()
SendMessage(iHandle, WM_COMMAND, WA_IPC_CMDS.ShowOpenURL, 0)
End Sub
Private Function HighWord(ByVal value As Integer) As Short
Return (value And &HFFFF0000) \ &H10000
End Function
Private Function LowWord(ByVal value As Integer) As Short
If (value And &HFFFF&) > &H7FFF Then
Return (value And &HFFFF&) - &H10000
Else
Return value And &HFFFF&
End If
End Function
End Class
|
|