VB 5/6-Tipp 0567: Winamp fernsteuern
von Mario Zeller
Beschreibung
Mit diesem Tipp kann man Winamp fernsteuern.
Update am 23. September von Tobias:
Im Quellcode ist nun auch ein Kommentar vorhanden, wie man Winamp 5 ansteuern kann.
Schwierigkeitsgrad: | Verwendete API-Aufrufe: FindWindowA (FindWindow), GetWindowTextA (GetWindowText), SendMessageA (SendMessage) | Download: |
'Dieser Quellcode stammt von http://www.activevb.de 'und kann frei verwendet werden. Für eventuelle Schäden 'wird nicht gehaftet. 'Um Fehler oder Fragen zu klären, nutzen Sie bitte unser Forum. 'Ansonsten viel Spaß und Erfolg mit diesem Source! '------------- Anfang Projektdatei Projekt1.vbp ------------- ' Die Komponente 'Microsoft Windows Common Controls 6.0 (SP6) (MSCOMCTL.OCX)' wird benötigt. '--------- Anfang Formular "Form1" alias Form1.frm --------- ' Steuerelement: Schaltfläche "cmdID3" ' Steuerelement: Schaltfläche "cmdOpenURL" ' Steuerelement: Schaltfläche "cmdOpenFile" ' Steuerelement: Schaltfläche "cmdPLEnd" ' Steuerelement: Schaltfläche "cmdPLStart" ' Steuerelement: Schaltfläche "cmdClose" ' Steuerelement: Schaltfläche "cmdPL" ' Steuerelement: Schaltfläche "cmdEQ" ' Steuerelement: Schaltfläche "cmdMW" ' Steuerelement: Rahmensteuerelement "Frame1" ' Steuerelement: Beschriftungsfeld "lblChannels" auf Frame1 ' Steuerelement: Beschriftungsfeld "lblBitrate" auf Frame1 ' Steuerelement: Beschriftungsfeld "lblSample" auf Frame1 ' Steuerelement: Beschriftungsfeld "Label4" auf Frame1 ' Steuerelement: Beschriftungsfeld "Label3" auf Frame1 ' Steuerelement: Beschriftungsfeld "Label2" auf Frame1 ' Steuerelement: Schaltfläche "cmdVolIncr" ' Steuerelement: Schaltfläche "cmdVolDecr" ' Steuerelement: Slider "sldVol" ' Steuerelement: Schaltfläche "cmdNext" ' Steuerelement: Schaltfläche "cmdFFW" ' Steuerelement: Schaltfläche "cmdStop" ' Steuerelement: Schaltfläche "cmdPause" ' Steuerelement: Schaltfläche "cmdPlay" ' Steuerelement: Schaltfläche "cmdFRW" ' Steuerelement: Schaltfläche "cmdPrev" ' Steuerelement: Slider "sldLength" ' Steuerelement: Timersteuerelement "Timer1" ' Steuerelement: Beschriftungsfeld "Label1" ' Steuerelement: Beschriftungsfeld "lblTime" ' Steuerelement: Beschriftungsfeld "lblSongName" 'Option Explicit ' 'Autor: Mario Zeller <Mario@ActiveVB.de> ' 'Hinweis: Funktioniert nicht mit Winamp 3.0! Option Explicit Private Sub cmdClose_Click() SendMessage WA_hwnd, WM_COMMAND, WA_CLOSE, 0 End Sub Private Sub cmdEQ_Click() SendMessage WA_hwnd, WM_COMMAND, WA_TOGGLEEQ, 0 End Sub Private Sub cmdFFW_Click() SendMessage WA_hwnd, WM_COMMAND, WA_FFW, 0 End Sub Private Sub cmdFRW_Click() SendMessage WA_hwnd, WM_COMMAND, WA_FRW, 0 End Sub Private Sub cmdID3_Click() SendMessage WA_hwnd, WM_COMMAND, WA_INFOBOX, 0 End Sub Private Sub cmdMW_Click() SendMessage WA_hwnd, WM_COMMAND, WA_TOGGLEMW, 0 End Sub Private Sub cmdNext_Click() SendMessage WA_hwnd, WM_COMMAND, WA_NEXT, 0 End Sub Private Sub cmdOpenFile_Click() SendMessage WA_hwnd, WM_COMMAND, WA_OPENFILE, 0 End Sub Private Sub cmdOpenURL_Click() SendMessage WA_hwnd, WM_COMMAND, WA_OPENURL, 0 End Sub Private Sub cmdPause_Click() SendMessage WA_hwnd, WM_COMMAND, WA_PAUSE, 0 End Sub Private Sub cmdPL_Click() SendMessage WA_hwnd, WM_COMMAND, WA_TOGGLEPL, 0 End Sub Private Sub cmdPlay_Click() SendMessage WA_hwnd, WM_COMMAND, WA_PLAY, 0 End Sub Private Sub cmdPLEnd_Click() SendMessage WA_hwnd, WM_COMMAND, WA_PLEND, 0 End Sub Private Sub cmdPLStart_Click() SendMessage WA_hwnd, WM_COMMAND, WA_PLSTART, 0 End Sub Private Sub cmdPrev_Click() SendMessage WA_hwnd, WM_COMMAND, WA_PREV, 0 End Sub Private Sub cmdStop_Click() SendMessage WA_hwnd, WM_COMMAND, WA_STOP, 0 End Sub Private Sub cmdVolDecr_Click() SendMessage WA_hwnd, WM_COMMAND, WA_VOLDECR, 0 End Sub Private Sub cmdVolIncr_Click() SendMessage WA_hwnd, WM_COMMAND, WA_VOLINCR, 0 End Sub Private Sub Form_Load() ' Eine Winamp Instance finden, wenn keine Vorhanden abbrechen ' Findwindow funktioniert mit Winamp 2 und 5 ' Beide hören auf den Titel "Winamp v1.x" WA_hwnd = FindWindow("Winamp v1.x", vbNullString) If WA_hwnd = 0 Then MsgBox "Winamp ist im Moment nicht aktiv. Bitte erst starten!" Unload Me End End If DONTCHANGEBAR = False End Sub Private Sub sldLength_MouseDown(Button As Integer, Shift As Integer, x As Single, y As Single) DONTCHANGEBAR = True End Sub Private Sub sldLength_MouseUp(Button As Integer, Shift As Integer, x As Single, y As Single) SendMessage WA_hwnd, WM_USER, sldLength.Value * 1000, WA_SEEK DONTCHANGEBAR = False End Sub Private Sub sldVol_Scroll() SendMessage WA_hwnd, WM_USER, sldVol.Value * 25.5, WA_VOLUME End Sub Private Sub Timer1_Timer() On Error Resume Next Dim lngCurrentTime As Long Dim lngTrackTime As Long Dim strCurrentMin As String Dim strCurrentSec As String Dim strTrackMin As String Dim strTrackSec As String 'Zeiten holen lngCurrentTime = SendMessage(WA_hwnd, WM_USER, 0, WA_TIME) lngTrackTime = SendMessage(WA_hwnd, WM_USER, 1, WA_TIME) 'Slider einstellen If DONTCHANGEBAR = False Then sldLength.Max = lngTrackTime sldLength.Value = lngCurrentTime \ 1000 End If 'Zeiten umrechnen und anzeigen lngCurrentTime = lngCurrentTime \ 1000 strCurrentMin = AddZeroes(Trim(Str(lngCurrentTime \ 60))) strCurrentSec = AddZeroes(Trim(Str(lngCurrentTime - 60 * (lngCurrentTime \ 60)))) strTrackMin = AddZeroes(Trim(Str(lngTrackTime \ 60))) strTrackSec = AddZeroes(Trim(Str(lngTrackTime - 60 * (lngTrackTime \ 60)))) lblTime.Caption = strCurrentMin & ":" & strCurrentSec & "/" & _ strTrackMin & ":" & strTrackSec 'Songtitel anzeigen lblSongName.Caption = GetSongName 'TrackInfos setzen lblSample.Caption = SendMessage(WA_hwnd, WM_USER, 0, WA_TRACKINFO) lblBitrate.Caption = SendMessage(WA_hwnd, WM_USER, 1, WA_TRACKINFO) lblChannels.Caption = SendMessage(WA_hwnd, WM_USER, 2, WA_TRACKINFO) End Sub '---------- Ende Formular "Form1" alias Form1.frm ---------- '--------- Anfang Modul "Module1" alias Module1.bas --------- Option Explicit Public Declare Function GetWindowText Lib "user32" _ Alias "GetWindowTextA" ( _ ByVal hwnd As Long, _ ByVal lpString As String, _ ByVal cch As Long _ ) As Long Public Declare Function FindWindow Lib "user32" _ Alias "FindWindowA" ( _ ByVal lpClassName As String, _ ByVal lpWindowName As String _ ) As Long Public Declare Function SendMessage Lib "user32" _ Alias "SendMessageA" ( _ ByVal hwnd As Long, _ ByVal wMsg As Long, _ ByVal wParam As Long, _ ByVal lParam As Long _ ) As Long Public DONTCHANGEBAR As Boolean Public Const WM_COMMAND As Long = &H111& Public Const WM_USER As Long = &H400& Public WA_hwnd As Long ' Dies sind nur einige der vielen vorhandenen Konstanten. ' All denjenigen, welche weitere Infos benötigen, sei die Seite ' http://www.winamp.com/nsdn/winamp2x/dev/sdk/api.jhtml ' ans Herz gelegt. ' Manche der Konstanten funktionieren nur mit Winamp-Versionen ' neuer als 2.05! 'Konstanten zur Steuerung via WM_COMMAND Public Const WA_PREV = 40044 'Previous track button Public Const WA_NEXT = 40048 'Next track button Public Const WA_PLAY = 40045 'Play button Public Const WA_PAUSE = 40046 'Pause/Unpause button Public Const WA_STOP = 40047 'Stop button Public Const WA_FADESTOP = 40147 'Fadeout and stop Public Const WA_STOPTRACK = 40157 'Stop after current track Public Const WA_FFW = 40148 'Fast-forward 5 seconds Public Const WA_FRW = 40144 'Fast-rewind 5 seconds Public Const WA_PLSTART = 40154 'Start of playlist Public Const WA_PLEND = 40158 'Go to end of playlist Public Const WA_OPENFILE = 40029 'Open file dialog Public Const WA_OPENURL = 40155 'Open URL dialog Public Const WA_INFOBOX = 40188 'Open file info box Public Const WA_TOGGLEEQ = 40036 'Toggle EQ Public Const WA_TOGGLEPL = 40040 'Toggle playlist editor Public Const WA_TOGGLEMW = 40258 'Toggle main window visible Public Const WA_VOLINCR = 40058 'Raise volume by 1% Public Const WA_VOLDECR = 40059 'Lower volume by 1% Public Const WA_CLOSE = 40001 'Close Winamp Public Const WA_AUDIOCD = 40323 'Play audio CD 'Konstanten for WM_USER 'Gibt die Versionsnummer zurück Public Const WA_VERSION = 0 'Gibt bei wParam=0 die Spielzeit und bei wParam=1 die Tracklänge zurück Public Const WA_TIME = 105 'Setzt die Position auf wParam in ms Public Const WA_SEEK = 106 'Setzt die Lautstärke in wParam von 0 bis 255 Public Const WA_VOLUME = 122 'Setzt die Balance in wParam zwishcen 0 und 255. 128=Mitte Public Const WA_PANNING = 123 'Gibt bei 0 die Sampe-, bei 1 die Bitrate und bei 2 die Channels zurück Public Const WA_TRACKINFO = 126 'Fügt der Zeit fehlende Nullen hinzu Function AddZeroes(strAdd As String) As String If Len(strAdd) = 1 Then AddZeroes = "0" + strAdd Else AddZeroes = strAdd End If End Function 'Extrahiert den Titel das aktuellen Songs Function GetSongName() As String On Error Resume Next Dim strTitle As String strTitle = String(2048, " ") GetWindowText WA_hwnd, strTitle, Len(strTitle) GetSongName = Left$(strTitle, InStr(strTitle, "- Winamp") - 1) End Function '---------- Ende Modul "Module1" alias Module1.bas ---------- '-------------- Ende Projektdatei Projekt1.vbp --------------
Tipp-Kompatibilität:
Windows/VB-Version | Win32s | Win95 | Win98 | WinME | WinNT4 | Win2000 | WinXP |
VB4 | |||||||
VB5 | |||||||
VB6 |
Ihre Meinung
Falls Sie Fragen zu diesem Artikel haben oder Ihre Erfahrung mit anderen Nutzern austauschen möchten, dann teilen Sie uns diese bitte in einem der unten vorhandenen Themen oder über einen neuen Beitrag mit. Hierzu können sie einfach einen Beitrag in einem zum Thema passenden Forum anlegen, welcher automatisch mit dieser Seite verknüpft wird.
Archivierte Nutzerkommentare
Klicken Sie diesen Text an, wenn Sie die 26 archivierten Kommentare ansehen möchten.
Diese stammen noch von der Zeit, als es noch keine direkte Forenunterstützung für Fragen und Kommentare zu einzelnen Artikeln gab.
Aus Gründen der Vollständigkeit können Sie sich die ausgeblendeten Kommentare zu diesem Artikel aber gerne weiterhin ansehen.
Kommentar von GKWelz am 05.09.2009 um 18:53
Hallo,
o.g. Coding funktioniert bestens. Wollte eigene Erweiterungen einbauen, leider ist die angegebene Seite http://www.winamp.com/nsdn/winamp2x/dev/sdk/api.jhtml für weitere Konstanten nicht mehr vorhanden.
Wo kann ich die Konstanten finden?
Vielen Dank.
Gruß
gkwelz
Kommentar von piper am 21.05.2009 um 00:51
Hi Mario
Vielen Dank für den Code. Er liefert keine Angaben zum laufenden Stream (oder File). Habe gegoogelt und eine sehr effektive und robuste Funktion <GetPlayingFileName> gefunden. Für alle die's interessiert.
cheers
Alfred
Source:
http://msmvps.com/blogs/ch21st/archive/2004/02/26/3279.aspx
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
(ByVal lpszClassName As String, ByVal lpszWindowName As String) As Long
Private Declare Function GetWindowThreadProcessId Lib "user32" _
(ByVal hwnd As Long, ByRef lpdwProcessId As Long) As Long
Private Declare Function OpenProcess Lib "kernel32" _
(ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Private Const PROCESS_VM_READ As Long = &H10
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
(ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Private Const WM_USER As Long = &H400
Private Const IPC_GETPLAYLISTFILE As Long = 211
Private Const IPC_GETLISTPOS As Long = 125
Private Declare Function ReadProcessMemory Lib "kernel32" _
(ByVal hProcess As Long, ByVal lpBaseAddress As Long, _
ByRef lpBuffer As Any, ByVal nSize As Long, ByRef lpNumberOfBytesRead As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Const MAX_PATH As Long = 260
Private hWndWinamp As Long
Private Function GetWinampWindow() As Long
GetWinampWindow = FindWindow("Winamp v1.x", vbNullString)
End Function
Public Function GetPlayingFileName() As String
Dim strFileName As String
Dim lp As Long, lpWinamp As Long
Dim iIndex As Long
Dim PID As Long
Dim bRet As Long
Dim dwRead As Long
Dim Buffer(MAX_PATH) As Byte
Dim Temp As String
hWndWinamp = GetWinampWindow
If hWndWinamp = 0 Then
GetPlayingFileName = ""
Exit Function
End If
iIndex = SendMessage(hWndWinamp, WM_USER, 0, IPC_GETLISTPOS)
lp = SendMessage(hWndWinamp, WM_USER, iIndex, IPC_GETPLAYLISTFILE)
If lp = 0 Then
GetPlayingFileName = ""
Exit Function
End If
Call GetWindowThreadProcessId(hWndWinamp, PID)
'
lpWinamp = OpenProcess(PROCESS_VM_READ, 0, PID)
If lpWinamp = 0 Then
GetPlayingFileName = ""
Exit Function
End If
bRet = ReadProcessMemory(lpWinamp, lp, Buffer(0), MAX_PATH, dwRead)
Call CloseHandle(lpWinamp)
Temp = StrConv(Buffer, vbUnicode)
strFileName = Left$(Temp, InStr(Temp, Chr$(0)) - 1)
GetPlayingFileName = strFileName
End Function
Kommentar von Anyway am 02.03.2009 um 21:24
Woher kommen denn bitte die Constants? Wie kann man die denn überhaupt bestimmen?
Kommentar von Thomas Frosch am 29.07.2008 um 21:36
kann man auch irgendwie die Lautstärke auslesen?
Kommentar von Balmung am 10.11.2007 um 21:54
Problem solved!
Ich habe statt GetWindowText -> GetWindowTextW genommen (welches ich nach längerem googlen entdeckt hab)...
jetzt brauch ich nur noch die daten korrekt umwandeln und fertig bin ich :)
mfg Balmung
Kommentar von Balmung am 10.11.2007 um 21:19
Ich hab bei dem code ein kleines Problem, und zwar mit der Kodierung im Titel.
Wenn ich den Titel mit dem oben angegeben Code auslesen, werden Asiatische Zeichen in Fragezeichen umgewandelt.
Siehe hier:
http://junemaster.ju.funpic.de/niff/strTitle.png
Kennt vielleicht jemand eine Lösung, wie ich die korrekten ID3v2 Tags, wie sie winamp bei mir anzeigt auslesen kann? (ohne auf die originale mp3 zugreifen zu müssen, da es sich ja auch um einen Stream handeln könnte)
Ich wäre für jede hilfe dankbar
mfg Balmung
Kommentar von PRE am 06.01.2006 um 13:24
ich habe noch eine kleine verbesserung!
'TrackInfos setzen
lblSample.Caption = SendMessage(WA_hwnd, WM_USER, 0, WA_TRACKINFO) & " kHz"
lblBitrate.Caption = SendMessage(WA_hwnd, WM_USER, 1, WA_TRACKINFO) & " kbps"
If SendMessage(WA_hwnd, WM_USER, 2, WA_TRACKINFO) = 1 Then lblChannels.Caption = "Mono"
If SendMessage(WA_hwnd, WM_USER, 2, WA_TRACKINFO) = 2 Then lblChannels.Caption = "Stereo"
If SendMessage(WA_hwnd, WM_USER, 2, WA_TRACKINFO) < 1 Then lblChannels.Caption = "???"
If SendMessage(WA_hwnd, WM_USER, 2, WA_TRACKINFO) > 2 Then lblChannels.Caption = "Dolby Souround"
End Sub
gruß PRE
Kommentar von Daniel R. am 05.01.2006 um 21:31
Für alle die's einfacher haben wollen oder die Probleme mit dem Code haben:
http://www.winamp.com/plugins/details.php?id=144432
Kommentar von Kriechi am 18.11.2005 um 19:29
aber ich muss ihm doch erstmal sagen "so jetzt wird gespielt, beim klick dann pausieren,..."
nur wie?
danke
Kommentar von Passo am 18.11.2005 um 19:06
Naja, du packst beides in die click-funktion, lässt aber je nach button.caption-wert die eine oder eben die andere funktion ausführen und die beschriftung ändern
Kommentar von Kriechi am 18.11.2005 um 18:11
Hallo!
einfach genial1
aber wie kann ich play und pause auf einen button legen?
drücken pause, nochmal drücken wieder play.
mfg
Kommentar von Jc am 26.10.2005 um 21:51
Ja die aktuelle m3u auslesen wo gerade gespielt wird.
Kommentar von Capone am 26.10.2005 um 19:04
Du könntest das mit der Html-Playlist erzeugen machen ^^
also das man die auslesen kann, wäre das ok? oder vllt ne .m3u auszulesen
Kommentar von Jc am 26.10.2005 um 01:50
Hi Leute,
ich hab mal so ne kleine Frage ich müsste die Playliste wo gerade in Winamp gespielt wird in eine ListBox einfügen, bitte um Hilfe !!!
Danke schon mal
By Jc
Kommentar von Capone am 11.04.2005 um 20:49
Function GetSongName() As String
Dim strTitle As String
strTitle = String(2048, " ")
GetWindowText WA_hwnd, strTitle, Len(strTitle)
If InStr(strTitle, "- Winamp") - 1 > 0 Then
GetSongName = _
Left$(strTitle, InStr(strTitle, "- Winamp") - 1) + _
" - Play"
End If
If InStr(strTitle, "- Winamp [Stopped]") - 1 > 0 Then
GetSongName = _
Left$(strTitle, InStr(strTitle, "- Winamp [Stopped]") - 1) + _
" - Stop"
End If
If InStr(strTitle, "- Winamp [Paused]") - 1 > 0 Then
GetSongName = _
Left$(strTitle, InStr(strTitle, "- Winamp [Paused]") - 1) + _
" - Pause"
End If
End Function
Gibt sicher eleganteres aber seinen zweck erfüllt es, man hat somit auch den namen bei pause oder stop, und das steht (is klar) auch mit da :)
Hab nen (jetzt noch) Provisorischen Webcontroller gebaut, man sieht nur was ich gerade abspiele is aber lustig wnen man sich das so angucken kann ^^
http://home.arcor.de/3-u/Winamp%20Servercontroll.exe
Update kommt noch aber:
1. zu faul
2. keine zeit
3. ich mach auch anderes ;D
Das Progg liest einfach eine txt auf nem Webspace aus die durch eine php datei verändert wird die wird wiederrum von meinem pc aus gefüttert xD na wenns den spass macht =P
Kommentar von Stefan am 11.03.2005 um 21:01
Einfach Klasse was für ein Service es hier gibt.....Vielen Dank
Kommentar von Buegeleisenschoner am 16.04.2004 um 23:07
auch lustig ist wwwinamp von Nullsoft und HALO 8
(googeln), damitz kann man winamp übers web fernsteuern
funzt mit allen winamps...
Kommentar von Passo am 10.12.2003 um 16:14
hab mir was zammengebastelt... nicht sehr elegant, funzt aber (sofern ein lied am Laufen is ^^)
Dim hwnd As Long
Dim txt As String
txt = String(255, Chr(0))
hwnd = FindWindow("Studio", vbNullString)
Call GetWindowText(hwnd, txt, 255)
txt = Left(txt, InStr(1, txt, Chr(0)) - 1)
txt = Mid(txt, InStr(1, txt, ".") + 2, Len(txt))
For i = 1 To 2
For j = Len(txt) To 1 Step -1
If Mid(txt, j, 1) = "(" Then
txt = Left(txt, j - 2)
Exit For
End If
Next j
Next i
MsgBox txt
Kommentar von Passo am 10.12.2003 um 13:49
Kann mir einer ein Beispiel geben, wie ich das mit winamp3 mache?
Es reicht, wenn der Titel ausgelesen wird
Big Thx
Kommentar von MaTTEvIL am 30.09.2003 um 22:08
Hi ich wollt mir ein MP3 fernsteuerungstool fuer counter strike zusammenbauen. Wi schaff ich das das wenn ich auf ne Taste drück das z.B. ein Track vorgespult wird ??
Kommentar von Nukeduke am 09.07.2003 um 16:50
Ich würde gerne die aktuelle Lautstärke auslesen....
Außerdem steht in dem Tipp nicht, wie ich Min und MAx für den Volume-Slider einstellen muss!!
Kommentar von D. Schüler am 19.05.2003 um 13:56
Ich habe mir schon vor langer Zeit den code von www.winamp.com hergenommen und ein "AmpControl" gebaut.
Es ist eine art "minimalbedienung" für Winamp 2.x. Es ist jetzt in der Version 2.0.
Zu finden auf http://www.schueler-page.de im Bereich "Downloads"
Gruß
D. Schüler
Kommentar von Gerrit am 07.04.2003 um 15:04
Es hat sich erledigt. Man bin ich blöd! :-P
Ist das einfach...!!
Kommentar von Gerrit am 07.04.2003 um 14:22
Ich will WinAmp gar nicht fernsteuern, sondern nur auslesen welches Lied gerade abgespielt wird. Geht das auch?
Danke schon mal!
MfG Gerrit
Kommentar von FanatiX am 26.02.2003 um 17:51
tjo winamp3 kennt keine sendmessage weil xml basierend...musst schon die hWnd von jedem steuerelement auf der oberfläche von wa3 auslesen, dann kannste die buttons alle seperate ansprechen...
Kommentar von Flo am 29.01.2003 um 08:37
hi
funktioniert aber leider net mit Winamp3
mfg Flo