Inverser le mouvement du curseur de la souris

Description

C'est juste un petit bout de code pour faire des farces ou inclure dans un trojan, ça servira sans doute aux débutants comme moi qui ne veulent pas perdre du temps à chercher comment faire.

C'est aussi un bon exemple d'utilisation des fonctions "GetCursorPos" et "SetCursorPos"

Source / Exemple :


'CODE POUR INVERSER LE MOUVEMENT DE LA SOURIS

'Sur une feuille, placer un Timer et 2 boutons
'Ajouter un module

'###############################
'### A mettre dans un module ###
'###############################
'Déclaration d'un nouveau type de variable contenant 2 éléments
Public Type Orthonormé
    X As Long
    Y As Long
End Type

'Fonction permettant de connaître la position X et Y du curseur de la souris
Declare Function GetCursorPos Lib "user32" (lpPoint As Orthonormé) As Long

'Fonction permettant de définir des coordonnées pour le curseur de la souris
Declare Function SetCursorPos Lib "user32" (ByVal X As Long, ByVal Y As Long) As Long

'########################################
'### A mettre dans le code de la Form ###
'########################################
Dim Pos_Précédente As Orthonormé 'Contient la position du curseur capturée une 1ère fois
Dim Pos_Actuelle As Orthonormé 'Contient la position du curseur capturée une 2ème fois, 1 demi 100e de seconde plus tard
Dim Pos_Inverse As Orthonormé 'Contient la position inverse du curseur par rapport à sa "Pos_Précédente" et sa "Pos_Actuelle"

Private Sub Form_Load()
    'Initialise l'objet Timer
    Timer1.Enabled = False
    Timer1.Interval = 5
End Sub

Private Sub Command1_Click()
    'Capture les coordonnées du curseur
    GetCursorPos Pos_Précédente
    'Copie ses coordonnées dans une 2e variable
    Pos_Inverse = Pos_Précédente
    'Active la minuterie qui contient le code d'inversion
    Timer1.Enabled = True
End Sub

Private Sub Command2_Click()
    'Arréte l'inversion du mouvement du curseur en désactivant l'objet Timer
    Timer1.Enabled = False
End Sub

Private Sub Timer1_Timer()
    'Enregistre la position actuelle du curseur
    GetCursorPos Pos_Actuelle

    'Teste si le curseur bouge, si c'est le cas il calcule le mouvement inverse et l'applique au curseur
    If Pos_Actuelle.X <> Pos_Précédente.X Or Pos_Actuelle.Y <> Pos_Précédente.Y Then
        'Calcul du mouvement inverse
        Pos_Inverse.X = Pos_Précédente.X + ((Pos_Actuelle.X - Pos_Précédente.X) * (-1))
        Pos_Inverse.Y = Pos_Précédente.Y + ((Pos_Actuelle.Y - Pos_Précédente.Y) * (-1))
        'positionne le curseur
        SetCursorPos Pos_Inverse.X, Pos_Inverse.Y
    End If

    'Teste si le curseur a atteint l'un des 4 bords de l'écran, si c'est le cas le curseur ressort de l'autre côté de l'écran (cela l'empêche de rester coincé)
    '
    'Si il touche le bord droit de l'écran le curseur est replacé sur le bord gauche
    If Pos_Inverse.X >= ScaleX(Screen.Width, vbTwips, vbPixels) Then SetCursorPos 1, Pos_Actuelle.Y
    'Pareil pour le bord gauche
    If Pos_Inverse.X <= 1 Then SetCursorPos ScaleX(Screen.Width, vbTwips, vbPixels) - 2, Pos_Actuelle.Y
    'Pareil pour le bas de l'écran
    If Pos_Inverse.Y >= ScaleY(Screen.Height, vbTwips, vbPixels) Then SetCursorPos Pos_Actuelle.X, 1
    'Pareil pour le haut de l'écran
    If Pos_Inverse.Y <= 1 Then SetCursorPos Pos_Actuelle.X, ScaleY(Screen.Height, vbTwips, vbPixels) - 2
    '
    'Les méthodes ScaleX ou ScaleY convertissent une mesure de hauteur ou de largeur en une autre, ici le "twips" en "pixel"

    'Enregistre la position du curseur pour pouvoir la comparer à la prochaine "position actuelle" et en déduire le mouvement de la souris
    GetCursorPos Pos_Précédente
End Sub

Conclusion :


Remerciement à fou volant13 et aux remarques de Shivan pour la gestion des collisions avec le bord de l'écran sur qui j'ai honteusement copité.
Oui, je sais que leur code a le même rôle que le mien mais chez moi il fonctionnait mal, c'est tout.

PS : Soyez indulgent svp c'est la première source que je dépose.

rePS : J'espère que c'est assez commenté ;-)

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.