Buchempfehlung
Windows-Programmierung. Das Entwicklerhandbuch zur WIN32-API
Windows-Programmierung. Das Entwicklerhandbuch zur WIN32-API
"Der" Petzold, das über 1000 Seiten starke Standardwerk zum Win32-API - besonders nützlich u. a. bei der GUI-Programmierung in FreeBASIC! [Mehr Infos...]
FreeBASIC-Chat
Es sind Benutzer im FreeBASIC-Chat online.
(Stand:  )
FreeBASIC bei Twitter
Twitter FreeBASIC-Nachrichten jetzt auch über Twitter erhalten. Follow us!

fb:porticula NoPaste

Info
Info / Hilfe
Liste
Übersicht / Liste
Neu
Datei hochladen
Suche
Quellcode suchen
Download
Dateidownload

Winamp Joystick/Gamepad Plugin

Uploader:Mitgliedgrindstone
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