Position de la souris au dernière appuis sur le bouton gauche de la souris [Résolu]

Polack77 1100 Messages postés mercredi 22 mars 2006Date d'inscription 15 avril 2018 Dernière intervention - 4 févr. 2009 à 16:01 - Dernière réponse : Renfield 17307 Messages postés mercredi 2 janvier 2002Date d'inscription 18 janvier 2017 Dernière intervention
- 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
Afficher la suite 

Votre réponse

12 réponses

Meilleure réponse
Polack77 1100 Messages postés mercredi 22 mars 2006Date d'inscription 15 avril 2018 Dernière intervention - 5 févr. 2009 à 12:14
3
Merci
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

Merci Polack77 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 72 internautes ce mois-ci

Commenter la réponse de Polack77
Meilleure réponse
Renfield 17307 Messages postés mercredi 2 janvier 2002Date d'inscription 18 janvier 2017 Dernière intervention - 5 févr. 2009 à 12:30
3
Merci
(voir ScreenToClient et ClientToScreen...)

Merci Renfield 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 72 internautes ce mois-ci

Commenter la réponse de Renfield
Meilleure réponse
Renfield 17307 Messages postés mercredi 2 janvier 2002Date d'inscription 18 janvier 2017 Dernière intervention - 5 févr. 2009 à 12:54
3
Merci
SetCursorPos me semble plus adapté que mouse_event (peu fiable)

Merci Renfield 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 72 internautes ce mois-ci

Commenter la réponse de Renfield
Meilleure réponse
Polack77 1100 Messages postés mercredi 22 mars 2006Date d'inscription 15 avril 2018 Dernière intervention - 5 févr. 2009 à 14:50
3
Merci
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

Merci Polack77 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 72 internautes ce mois-ci

Commenter la réponse de Polack77
Renfield 17307 Messages postés mercredi 2 janvier 2002Date d'inscription 18 janvier 2017 Dernière intervention - 4 févr. 2009 à 16:26
0
Merci
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...
Commenter la réponse de Renfield
Polack77 1100 Messages postés mercredi 22 mars 2006Date d'inscription 15 avril 2018 Dernière intervention - 5 févr. 2009 à 09:48
0
Merci
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
Commenter la réponse de Polack77
Renfield 17307 Messages postés mercredi 2 janvier 2002Date d'inscription 18 janvier 2017 Dernière intervention - 5 févr. 2009 à 12:28
0
Merci
c'est pour faire quoi tous ces calculs ?
Commenter la réponse de Renfield
Polack77 1100 Messages postés mercredi 22 mars 2006Date d'inscription 15 avril 2018 Dernière intervention - 5 févr. 2009 à 12:45
0
Merci
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
Commenter la réponse de Polack77
Renfield 17307 Messages postés mercredi 2 janvier 2002Date d'inscription 18 janvier 2017 Dernière intervention - 5 févr. 2009 à 12:47
0
Merci
pense bien a transformer tes twips en pixels
Commenter la réponse de Renfield
Polack77 1100 Messages postés mercredi 22 mars 2006Date d'inscription 15 avril 2018 Dernière intervention - 5 févr. 2009 à 12:52
0
Merci
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
Commenter la réponse de Polack77
Polack77 1100 Messages postés mercredi 22 mars 2006Date d'inscription 15 avril 2018 Dernière intervention - 5 févr. 2009 à 13:04
0
Merci
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
Commenter la réponse de Polack77
Renfield 17307 Messages postés mercredi 2 janvier 2002Date d'inscription 18 janvier 2017 Dernière intervention - 5 févr. 2009 à 14:55
0
Merci
FormParent.ScaleMode t'évite le ModePositionXY
Commenter la réponse de Renfield

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.