fb:porticula NoPaste
Winamp Joystick/Gamepad Plugin
Uploader: | grindstone |
Datum/Zeit: | 24.08.2013 08:35:25 |
#Include Once "windows.bi"
Declare Function finit () As Integer
Declare Sub fconfig
Declare Sub fquit
Declare Sub abfrage(parameter As Any Ptr)
Type winampGeneralPurposePlugin
version As Integer
description As Any Ptr
init As Any Ptr
config As Any Ptr
quit As Any Ptr
hwndParent As HWND
hDllInstance As HINSTANCE
End Type
Dim Shared As winampGeneralPurposePlugin plugin
Dim Shared As ZString * 100 winampklasse
Dim Shared As Any Ptr t1
With plugin
.version = &h10
.description = StrPtr("Gamepad plugin")
.init = @finit
.config = @fconfig
.quit = @fquit
.hwndParent = 0
.hDllInstance = 0
End With
Extern "C"
Function winampGetGeneralPurposePlugin () As winampGeneralPurposePlugin Ptr Export
Return @plugin
End Function
End Extern
Function finit() As Integer Export
GetClassName(plugin.hwndParent,@winampklasse, 100) 'aktuellen Winamp-Klassennamen ermitteln
t1 = ThreadCreate(@abfrage) 'Joystick-/Gamepadabfrage läuft in einem eigene Thread, da die
' Zeit zwischen zwei Aufrufen von "PluginProc" zu unregelmäßig ist
Return 0
End Function
Sub fconfig
MessageBox(plugin.hwndParent, "Hier sollte bei einem anständigen Plugin das Konfigurationsmenü erscheinen.", "", MB_OK)
End Sub
Sub fquit
FindWindow(@winampklasse,0)
End Sub
Sub abfrage (parameter As Any Ptr)
Dim As Single jx, jy, wartezeit = 0
Dim As Integer knopf, knopfvor, tknopf
Dim As LongInt zeitvor, tracklen
Do 'Endlosschleife zur Gamepad-/Joystickabfrage
If FindWindow(@winampklasse,0) = plugin.hwndParent Then 'Die Funktion
' "FindWindow(@winampklasse,0)" liefert das Handle des Winampfensters zurück, das im
' Vordergrund ist oder als letztes im Vordergrund war. Die Gamepadschleife wird nur dann
' durchlaufen, wenn dies mit dem Handle des eigenen Winampfensters (plugin.hwndParent)
' übereinstimmt. Ohne diese Abfrage würden bei mehreren laufenden Winampinstanzen ALLE
' Instanzen gleichzeitig auf jeden Tastendruck reagieren
If GetJoystick (0, knopf, jx, jy) Then
Sleep 1000,1 'kein Joystick/Gamepad angeschlossen -> jede Sekunde überprüfen
Else
If knopf Then 'Knopf gedrückt
If knopf And 1 Then 'Knopf 1
SendMessage(plugin.hwndParent,WM_COMMAND,40058,0) 'Winamp 1% lauter
If knopfvor Then 'Die Variable "knopfvor" ist <> 0, wenn der Knopf seit dem letzten
' Schleifendurchlauf nicht losgelassen wurde
wartezeit = 50 'Wartezeit bei gehaltenem Knopf
Else
wartezeit = 150 'Wartezeit nach erstem Knopfdruck
EndIf
ElseIf knopf And 2 Then 'Knopf 2
If knopfvor Then 'bei gehaltenem Knopf
zeitvor = SendMessage(plugin.hwndParent,WM_USER,0,105) 'aktuelle Position ermitteln
SendMessage(plugin.hwndParent,WM_USER,zeitvor + 1000,106) 'Winamp 1 Sekunde vor
wartezeit = 20
Else 'bei erstem Knopfdruck
SendMessage(plugin.hwndParent,WM_COMMAND,40148,0) 'Winamp 5 Sekunden vor
wartezeit = 150
EndIf
ElseIf knopf And 4 Then 'Knopf 3
SendMessage(plugin.hwndParent,WM_COMMAND,40059,0) 'Winamp 1% leiser
If knopfvor Then
wartezeit = 50 'Wartezeit bei gehaltenem Knopf
Else
wartezeit = 150 'Wartezeit nach erstem Knopfdruck
EndIf
ElseIf knopf And 8 Then 'Knopf 4
If knopfvor Then
zeitvor = SendMessage(plugin.hwndParent,WM_USER,0,105) 'aktuelle Position ermitteln
zeitvor -= 1000 'Winamp eine Sekunde zurück
If zeitvor > 0 Then
SendMessage(plugin.hwndParent,WM_USER,zeitvor,106) 'eine Sekunde zurück
Else 'Trackanfang erreicht --> 1 Track zurück
SendMessage(plugin.hwndParent,WM_COMMAND,40044,0) '1 Track zurück
Sleep 100, 1 'Winamp Zeit geben, die Aktion auszuführen
tracklen = SendMessage(plugin.hwndParent,WM_USER,1,105) * 1000 'Tracklänge in
' Millisekunden
SendMessage(plugin.hwndParent,WM_USER,tracklen - 1000,106) 'Position auf 1 Sekunde
' vor Ende setzen
EndIf
wartezeit = 20
Else
SendMessage(plugin.hwndParent,WM_COMMAND,40144,0) 'Winamp 5 Sekunden zurück
If SendMessage(plugin.hwndParent,WM_USER,0 , 105) < 10 Then 'Anfang --> 1 Track zurück
SendMessage(plugin.hwndParent,WM_COMMAND,40044,0) '1 Track zurück
Sleep 100, 1 'Winamp Zeit geben, die Aktion auszuführen
tracklen = SendMessage(plugin.hwndParent,WM_USER,1 , 105) * 1000 'Tracklänge in
' Millisekunden
SendMessage(plugin.hwndParent,WM_USER,tracklen - 3000 , 106) 'Position auf 3 Sekunden
' vor Ende setzen
EndIf
wartezeit = 150
EndIf
ElseIf knopf And 16 Then 'Knopf 5
SendMessage(plugin.hwndParent,WM_COMMAND,40048,0) 'Winamp nächster Track
If knopfvor Then
wartezeit = 30 'Wartezeit bei gehaltenem Knopf
Else
wartezeit = 200 'Wartezeit nach erstem Knopfdruck
EndIf
ElseIf knopf And 32 Then 'Knopf 6
SendMessage(plugin.hwndParent,WM_COMMAND,40048,0) 'Winamp nächster Track
If knopfvor Then
wartezeit = 30 'Wartezeit bei gehaltenem Knopf
Else
wartezeit = 200 'Wartezeit nach erstem Knopfdruck
EndIf
ElseIf knopf And 64 Then 'Knopf 7
SendMessage(plugin.hwndParent,WM_COMMAND,40044,0) 'Winamp voriger Track
If knopfvor Then
wartezeit = 30 'Wartezeit bei gehaltenem Knopf
Else
wartezeit = 200 'Wartezeit nach erstem Knopfdruck
EndIf
ElseIf knopf And 128 Then 'Knopf 8
SendMessage(plugin.hwndParent,WM_COMMAND,40044,0) 'Winamp voriger Track
If knopfvor Then
wartezeit = 30 'Wartezeit bei gehaltenem Knopf
Else
wartezeit = 200 'Wartezeit nach erstem Knopfdruck
EndIf
ElseIf (knopf And 256) And (knopfvor = 0) Then 'Knopf 9
SendMessage(plugin.hwndParent,WM_COMMAND,40045,0) 'Winamp play
ElseIf (knopf And 512) And (knopfvor = 0) Then 'Knopf 10
SendMessage(plugin.hwndParent,WM_COMMAND,40046,0) 'Winamp pause
EndIf 'Ende der Gamepad-/Joystickabfrage
'Warteschleife
wartezeit += GetTickCount() 'Die Funktion "GetTickCount()" gibt die Anzahl der
' Millisekunden seit dem Systemstatart zurück. Dadurch ist die Länge der
' Warteschleife unabhängig von der Prozessorgeschwindigkeit. Wenn kein Knopf
' gedrückt ist, wird die Warteschleife sofort beendet.
Do
GetJoystick(0,tknopf,jx,jy) 'Joystick/Gamepad abfragen
Loop Until (GetTickCount() > wartezeit) Or (tknopf = 0) 'Wartezeit ist abgelaufen oder
' Knopf wurde losgelassen
Else 'kein Knopf gedrückt
Sleep 50, 1 'Pause zur Ressourcenschonung, wirkt allerdings auch als Ansprech-
' verzögerung. Der Wert von 50ms ist ein Kompromiss zwischen beiden
' Effekten
EndIf
knopfvor = knopf 'gedrückten Knopf merken
wartezeit = 0
EndIf
Else 'diese Instanz wird nicht angesprochen
Sleep 200, 1 'Pause zur Ressourcenschonung
EndIf
Loop
End Sub