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!

Code-Beispiel

Code-Beispiele » Multimedia

Winamp per Gamepad/Joystick steuern

Lizenz:Erster Autor:Letzte Bearbeitung:
k. A.Mitgliedgrindstone 30.01.2013
#Include "windows.bi"

Dim As Single jx, jy, x, wartezeit
Dim As Integer knopf, knopfvor, tknopf
Dim As LongInt zeitvor, tracklen
Dim As HWND hWndWinamp, hWndDiesesFenster

hwndDiesesFenster = GetForegroundWindow()

'das Programm darf nur einmal laufen, da sich sonst die verschiedenen Instanzen gegenseitig stören
SetWindowText(hwndDiesesFenster,"WinampGamepadNew")
If FindWindow(0,"WinampGamepad") Then 'feststellen, ob Programm schon läuft
    End 'schon eine Instanz gestartet, Programm beenden
Else 'Programm starten
    SetWindowText(hwndDiesesFenster,"WinampGamepad")
  ShowWindow(hwndDiesesFenster,0)
EndIf

'Parameter für "ShowWindow":
'0 ' Versteckt das Fenster
'1 ' Aktiviert das Fenster
'2 ' Zeigt das Fenster an und Minimiert es
'3 ' Maximiert das Fenster
'4 ' Zeigt das Fenster an ohne es zu aktivieren
'5 ' Zeigt das Fenster an, auch wenn es versteckt ist
'6 ' Minmiert das Fenster
'7 ' Minimiert das Fenster aber aktiviert es nicht
'8 ' Zeigt das Fenster an aber aktiviert es nicht
'9 ' Stellt das Fenster wieder her

wartezeit = 0

Do 'Endlosschleife zur Gamepad-/Joystickabfrage
    If GetJoystick (0, knopf, jx, jy) Then
    'kein Gamepad/Joystick angeschlossen
      Sleep 10000, 1 'alle 10 Sekunden prüfen
    Else 'Gamepad/Joystick vorhanden
      hwndWinamp = FindWindow("Winamp v1.x",0) 'Fensterhandle von Winamp ermitteln. Diese
        ' Funktion wird bei jedem Schleifendurchlauf aufgerufen, damit ist sichergestellt, daß bei
        ' mehreren gestarteten Winampinstanzen immer die gerade aktive Instanz angesprochen wird
        If knopf Then 'Knopf gedrückt
                If knopf = 5 Then 'Knöpfe 1 und 3 gleichzeitig gedrückt --> GamepadWinamp beenden
                'Da das Programm weder ein sichtbares Fenster hat noch in der Taskleiste auftaucht, kann
            'es von Windows aus nur beendet werden, indem man es im Taskamager abschießt. Darum gibt
            'es hier die Möglichkeit, das Programm zu beenden, indem man die Knöpfe 1 und 3 (lauter
            'und leiser) 2 Sekunden lang gleichzeitig gedrückt hält.
            Sleep 2000 '2 Sekunden warten
            GetJoystick (0, knopf, jx, jy) 'Gamepad/Joystick erneut abfragen
            If knopf = 5 Then 'Knöpfe 1 und 3 sind immer noch gedrückt
                Select Case MessageBox(hwndDiesesFenster,"Programm beenden?","WinampGamepad",MB_YESNO)
                    Case 6 'Ja --> Programm beenden
                        End
                End Select
            EndIf
      ElseIf knopf And 1 Then 'Knopf 1
            SendMessage(hWndWinamp,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(hWndWinamp,WM_USER,0,105) 'aktuelle Position ermitteln
                SendMessage(hWndWinamp,WM_USER,zeitvor + 1000,106) 'Winamp 1 Sekunde vor
                wartezeit = 15
            Else 'bei erstem Knopfdruck
                SendMessage(hWndWinamp,WM_COMMAND,40148,0) 'Winamp 5 Sekunden vor
                wartezeit = 150
            EndIf
      ElseIf knopf And 4 Then 'Knopf 3
            SendMessage(hWndWinamp,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(hWndWinamp,WM_USER,0,105) 'aktuelle Position ermitteln
                zeitvor -= 1000 'Winamp eine Sekunde zurück
                If zeitvor > 0 Then
                    SendMessage(hWndWinamp,WM_USER,zeitvor,106) 'eine Sekunde zurück
                Else 'Trackanfang erreicht --> 1 Track zurück
                    SendMessage(hWndWinamp,WM_COMMAND,40044,0) '1 Track zurück
                    tracklen =  SendMessage(hWndWinamp,WM_USER,1,105) * 1000 'Tracklänge in Milli-
                                                                                 ' sekunden
                  SendMessage(hWndWinamp,WM_USER,tracklen - 1000,106) 'Position auf 1 Sekunde vor
                                                                            ' Ende setzen
                EndIf
                wartezeit = 15
            Else
                SendMessage(hWndWinamp,WM_COMMAND,40144,0) 'Winamp 5 Sekunden zurück
                If SendMessage(hWndWinamp,WM_USER,0 , 105) < 10 Then 'Anfang --> 1 Track zurück
                  SendMessage(hWndWinamp,WM_COMMAND,40044,0) '1 Track zurück
                  tracklen =    SendMessage(hWndWinamp,WM_USER,1 , 105) * 1000 'Tracklänge in Milli-
                                                                                   ' sekunden
                  SendMessage(hWndWinamp,WM_USER,tracklen - 3000 , 106) 'Position auf 3 Sekunden vor
                                                                              ' Ende setzen
                EndIf
                wartezeit = 150
            EndIf
      ElseIf knopf And 16 Then 'Knopf 5
            SendMessage(hWndWinamp,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(hWndWinamp,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(hWndWinamp,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(hWndWinamp,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 Then 'Knopf 9
            SendMessage(hWndWinamp,WM_COMMAND,40045,0) 'Winamp play
      ElseIf knopf And 512 Then 'Knopf 10
            SendMessage(hWndWinamp,WM_COMMAND,40046,0) 'Winamp pause
            wartezeit = 2000
      EndIf 'Ende der Gamepad-/Joystickabfrage

      'Warteschleife
        'Die Funktion "GetTickCount" gibt die Anzahl der Millisekunden seit dem Systemstatart
        ' zurück. Dadurch ist die Länge der Warteschleife unabhängig von der Prozessor-
        ' geschwindigkeit. Wenn kein Knopf gedrückt ist, wird die Warteschleife sofort
        ' beendet.
        wartezeit += GetTickCount()
        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
Loop

Zusätzliche Informationen und Funktionen
  • Das Code-Beispiel wurde am 15.01.2013 von Mitgliedgrindstone angelegt.
  • Die aktuellste Version wurde am 30.01.2013 von Mitgliedgrindstone gespeichert.
  Bearbeiten Bearbeiten  

  Versionen Versionen