Tipp 0189 WinAmp fernsteuern
Autor/Einsender:
Datum:
  Frank Grimm
04.02.2009
Entwicklungsumgebung:   VB.Net 2005
Framework:   2.0
In Anlehnung unseres VB Classic-Tipps 0199 wurde dieser Tipp konzipiert, um aufzuzeigen, dass es auch mit VB.Net möglich ist, ziemlich alles was mit der WinAmp Fremdprozess IPC erlaubt ist, anzusprechen.
Codeausschnitt  der Klasse cAmp
 
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
 
Hinweis
Der hier dargestellte Code beinhaltet lediglich einen Teil der Code-Klasse cAmp. Der gesamte Code mit einer entsprechenden Dokumentierung ist im Download-Projekt verfügbar.

Windows-Version
98/SE
ME
NT
2000
XP
Vista
Win 7


Download  (38 kB) Downloads bisher: [ 366 ]

Vorheriger Tipp Zum Seitenanfang Nächster Tipp

Startseite | Tipps | Projekte | Tutorials | Bücherecke | VB-/VBA-Tipps | API-Referenz | Komponenten | VB.Net-Forum | VB/VBA-Forum | DirectX-Forum | Foren-Archiv | DirectX | Chat | Spielplatz | Links | Suchen | Stichwortverzeichnis | Feedback | Impressum

Seite empfehlen Bug-Report
Letzte Aktualisierung: Mittwoch, 18. Januar 2012