Position de la souris au dernière appuis sur le bouton gauche de la souris

Résolu
Polack77 Messages postés 1098 Date d'inscription mercredi 22 mars 2006 Statut Membre Dernière intervention 22 octobre 2019 - 4 févr. 2009 à 16:01
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 - 5 févr. 2009 à 14:55
Bonjour,

Alors voila je cherche en ce moment à récupérer la position de la souris AU MOMENT du dernier appuis sur le bouton gauche de la souris (si possible, j'explique pourquoi plus bas mais si vous avez une autre solution je suis preneur)

Déjà ce qui me fait dire que c'est possible :
http://www.developpez.net/forums/d210919/dotnet/csharp/csharp-2-detecter-click-souris-maniere-globale/
Sur ce topic bossun (je l'es contacté) à l'aire sur de lui quand il dit :
"la moindre petite action que tu génère crée des messages dans ton OS que tu peux récupérer par après"
Donc je me dit que sa pourrais me permettre de corrigé un petit problème que je rencontre actuellement
J'imagine qu'une API existe....

Le problème que je veut corrigé :
Je cherche à interdire le déplacement des graphique dans un MSChart (VB6) pour cela j'utilise l'API mouse_event pour forcé le relâchement du click au moment de la sélection d'une liste (ou d'un point). Ce qui fonctionne très bien. Donc je veut maintenant me crée une classe "ClassMSChartUnmovable" qui prendras en charge la gestion de tout les MSChart de mon appli (pck il y en à ÉNORMÉMENT en final ). Problème si l'événement sélect d'une liste déclaré sur la form met du temps à s'exécute (et une simple mise à jours du label d'un caption suffi) alors l'utilisateur pourras déplacé (très légèrement dans le cas de la maj du label, mais trop quand même) la liste (effet très visible en camembert).
Donc il fraudais que :
 - soit l'événement de ma classe soit exécuté le 1er.
 - soit que je connaisse la position de la souris au moment de l'appuis et acini la remettre en place avent le relâchement forcé.
 - soit sauvegardé et repositioné les éléments du graph mais je n'es pas trouvé de propriété accésible dans les MSChart pour faire sa non plus

J'espère avoir été claire sur mon problème

Bonne prog
 Amicalement <!-- /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-pa

12 réponses

Polack77 Messages postés 1098 Date d'inscription mercredi 22 mars 2006 Statut Membre Dernière intervention 22 octobre 2019 1
5 févr. 2009 à 12:14
Tout vas bien les X et Y semble correct
(J'utilise SetCursorPos qui reçoit des pixel plutôt que mouse_event qui attend des valeur de 0 à 65535)

Ma fonction de placement du pointeur :

Private Declare Function SetCursorPos Lib "user32" (ByVal x As Long, ByVal y As Long) As Long

Public Sub MousePlaceSourisForm(ByVal ScaleX As Long, ByVal ScaleY As Long, ByRef FormParent As Form, Optional ModePositionXY As ScaleModeConstants = vbTwips)
    Dim Xpos As Long
    Dim Ypos As Long
   
    Dim TailleBordure As Long
    Dim TailleTitre As Long

    TailleBordure = FormParent.ScaleX(FormParent.Width, vbTwips, vbPixels)
    TailleBordure = TailleBordure - FormParent.ScaleX(FormParent.ScaleWidth, FormParent.ScaleMode, vbPixels)
    TailleBordure = TailleBordure / 2
   
    TailleTitre = FormParent.ScaleY(FormParent.Height, vbTwips, vbPixels)
    TailleTitre = TailleTitre - FormParent.ScaleY(FormParent.ScaleHeight, FormParent.ScaleMode, vbPixels)
    TailleTitre = TailleTitre - TailleBordure

    Xpos = FormParent.ScaleX(ScaleX, ModePositionXY, vbPixels)
    Xpos = Xpos + FormParent.ScaleX(FormParent.left, vbTwips, vbPixels) + TailleBordure
   
    Ypos = FormParent.ScaleY(ScaleY, ModePositionXY, vbPixels)
    Ypos = Ypos + FormParent.ScaleY(FormParent.tOp, vbTwips, vbPixels) + TailleTitre
   
    SetCursorPos Xpos, Ypos
End Sub

Bonne prog à tous

 Amicalement <!-- /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-pa
3
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
5 févr. 2009 à 12:30
(voir ScreenToClient et ClientToScreen...)
3
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
5 févr. 2009 à 12:54
SetCursorPos me semble plus adapté que mouse_event (peu fiable)
3
Polack77 Messages postés 1098 Date d'inscription mercredi 22 mars 2006 Statut Membre Dernière intervention 22 octobre 2019 1
5 févr. 2009 à 14:50
Bon bà voila la fonction :
ATTENTION les X et Y doivent être issu de la form (et non d'un contrôle) pour que le placement soit correct ;)

Public Sub MousePlaceSourisForm(ByVal ScaleX As Long, ByVal ScaleY As Long, ByRef FormParent As Form, Optional ModePositionXY As ScaleModeConstants = vbTwips)
Dim PositionSouris As POINTAPI
    PositionSouris.x = FormParent.ScaleX(ScaleX, ModePositionXY, vbPixels)
    PositionSouris.y = FormParent.ScaleY(ScaleY, ModePositionXY, vbPixels)

    ClientToScreen FormParent.hwnd, PositionSouris
    SetCursorPos PositionSouris.x, PositionSouris.y
End Sub

 Amicalement <!-- /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-pa
3

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
4 févr. 2009 à 16:26
simple SubClassing

lorsque le curseur de ta souris arrive sur un chart, espionne les messages de la souris.
si tu vois un click, supprime le de la file,
si tu vois un autre message, transmets le a la fonction de gestion d'origine

tu peux peut etre même jouer simplement, avec l'evenement indiquant la prise du focus...
0
Polack77 Messages postés 1098 Date d'inscription mercredi 22 mars 2006 Statut Membre Dernière intervention 22 octobre 2019 1
5 févr. 2009 à 09:48
Oui en effet je dois pouvoir faire sa avec le SubClassing (tu veut dire en créant un user control contenant un MSChart. Faudrait que je re-potasse le sub classing, un tuto existe sur ce forum donc pas de soucis)

En ce moment je m'intéresse à l'évènement "mouse_down" du MSChart qui me donne la positon X,Y de la souris au moment du click je vérif si la position est bien exacte. Si ce n'est pas le cas je pense que le SubClassing fera l'affaire

Merci pour ta réponse

 Amicalement <!-- /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-pa
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
5 févr. 2009 à 12:28
c'est pour faire quoi tous ces calculs ?
0
Polack77 Messages postés 1098 Date d'inscription mercredi 22 mars 2006 Statut Membre Dernière intervention 22 octobre 2019 1
5 févr. 2009 à 12:45
Je ne m'en suis pas servie car je ne connaissais pas leur existence Forcément dur de l'utilisé .

Par contre je ne comprend pas bien son fonctionnement ????
Ci dessous ne fonctionne pas (enfin la souris n'est pas à l'emplacement voulut) :

Private Declare Sub mouse_event Lib "user32" (ByVal dwFlags As Long, ByVal dx As Long, ByVal dy As Long, ByVal cButtons As Long, ByVal dwExtraInfo As Long)
Private Declare Function ClientToScreen Lib "user32" (ByVal hwnd As Long, lpPoint As POINTAPI) As Long

Type POINTAPI
    x As Long
    y As Long
End Type

Private Const C_MouseEventF_Absolute = &H8000
Private Const C_MouseEventF_Move = &H1

Public Sub MousePlaceSourisForm(ByVal ScaleX As Long, ByVal ScaleY As Long, ByRef FormParent As Form) ', Optional ModePositionXY As ScaleModeConstants = vbTwips
Dim test As POINTAPI
    test.x = ScaleX
    test.y = ScaleY
    ClientToScreen FormParent.hwnd, test
    mouse_event C_MouseEventF_Move Or C_MouseEventF_Absolute, test.x, test.y, 0, 0
    'mouse_event C_MouseEventF_Move, test.x, test.y, 0, 0 '<- Sa c'est pire :/
End Sub

Peut tu me dire où je me plante ?

 Amicalement <!-- /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-pa
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
5 févr. 2009 à 12:47
pense bien a transformer tes twips en pixels
0
Polack77 Messages postés 1098 Date d'inscription mercredi 22 mars 2006 Statut Membre Dernière intervention 22 octobre 2019 1
5 févr. 2009 à 12:52
Pas mieux ????????
Aurais tu un exemple svp ?

(mon test :
    test.x = FormParent.ScaleX(ScaleX, vbTwips, vbPixels)
    test.y = FormParent.ScaleY(ScaleY, vbTwips, vbPixels)
    ClientToScreen FormParent.hwnd, test
    mouse_event C_MouseEventF_Move Or C_MouseEventF_Absolute, test.x, test.y, 0, 0
)

 Amicalement <!-- /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-pa
0
Polack77 Messages postés 1098 Date d'inscription mercredi 22 mars 2006 Statut Membre Dernière intervention 22 octobre 2019 1
5 févr. 2009 à 13:04
Oui avec SetCursorPos sa fonctionne (je poste la fonction cette apprem on m'attend pour mangé)

MERCI bien Renfield

 Amicalement <!-- /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-pa
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
5 févr. 2009 à 14:55
FormParent.ScaleMode t'évite le ModePositionXY
0
Rejoignez-nous