Option Explicit 

Public Icbellevue As NOTIFYICONDATA
Public Pt As POINTAPI
Public Jc As JOYCAPS
Public Ji As JOYINFO
Public Jix As JOYINFOEX

Public lpPrevWndProc As Long

Public BTEvent() As Long

Public iA As Integer, iB As Integer
Public lA As Long, x As Long, y As Long
Public Sub Main()
    'Bellevue Joystick ne doit pas être déjà démarré
    If App.PrevInstance Then End


    
    'Vérifie la présence d'un gestionnaire de joystick
    If joyGetNumDevs() = 0 Then
        MsgBox "Pas de gestionnaire de joystick!", vbExclamation
        End
    End If
    
    'Ajoute l'icône dans la barre des taches
    With Icbellevue
        .cbSize = Len(Icbellevue)
        .hIcon = frmTray.Icon
        .hwnd = frmTray.hwnd
        .szTip = "Bellevue Joystick" & vbNullChar
        .uCallbackMessage = WM_MOUSEMOVE
        .uFlags = NIF_ICON Or NIF_MESSAGE Or NIF_TIP
        .uID = 1&
    End With
    
    Shell_NotifyIconA NIM_ADD, Icbellevue

    'Capture les évenements de la fenêtre frmTray
    lpPrevWndProc = SetWindowLongA(frmTray.hwnd, GWL_WNDPROC, AddressOf WindowProc)
    
    'Capture les évenements du joystick
    RetVal = joySetCapture(frmTray.hwnd, JOYSTICKID1, 0, False)
    If RetVal Then
        MsgBox "Impossible de capturer le joystick", vbExclamation
        Fin
    End If
End Sub
Public Function WindowProc(ByVal hwnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    Select Case uMsg
        Case MM_JOY1BUTTONDOWN
            Select Case wParam
            
            End Select
            Debug.Print lParam
            mouse_event MOUSEEVENTF_ABSOLUTE Or MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0
        Case MM_JOY1BUTTONUP
            Select Case wParam
            
            End Select
            mouse_event MOUSEEVENTF_ABSOLUTE Or MOUSEEVENTF_LEFTUP, 0, 0, 0, 0
        Case MM_JOY1MOVE
            GetCursorPos Pt
            
            x = (LOWORD(lParam)) / 2048
            y = (HIWORD(lParam)) / 2048
            
            If x <= 12 Then
                Pt.x = Pt.x + x - 17
            ElseIf x >= 20 Then
                Pt.x = Pt.x + x - 15
            End If
            
            If y <= 12 Then
                Pt.y = Pt.y + y - 17
            ElseIf y >= 20 Then
                Pt.y = Pt.y + y - 15
            End If
            
            SetCursorPos Pt.x, Pt.y
    End Select

    WindowProc = CallWindowProcA(lpPrevWndProc, hwnd, uMsg, wParam, lParam)
End Function

Public Sub Fin()
    'Supprime l'icône
    Shell_NotifyIconA NIM_DELETE, Icbellevue

    'Arrête la capture du joystick
    joyReleaseCapture JOYSTICKID1
    
    'Arrête la capture des évenements
    RetVal = SetWindowLongA(frmTray.hwnd, GWL_WNDPROC, lpPrevWndProc)

    Unload frmTray
End Sub