IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Delphi Discussion :

Détecter un clic de souris


Sujet :

Delphi

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 12
    Points : 12
    Points
    12
    Par défaut Détecter un clic de souris
    Bonjour,

    Je souhaite que mon application soit capable de détecter lorsque l'utilisateur clique le bouton central de la souris, et cela même quand un autre programme est au premier plan.

    Certains pilotes de souris permettaient d'associer un évènement, par exemple Lancer un Explorateur quand le bouton central est enfoncé depuis n'importe quelle application. C'est exactement ceci que je cherche à reproduire, une sorte de RegisterHotKey mais pour la souris.

    Quelqu'un a une idée ?

    Merci,
    Illioc

  2. #2
    Membre chevronné
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 262
    Points : 1 928
    Points
    1 928
    Par défaut
    Bienvenue sur developpez.com !

    Pour les prochaines fois : merci de ne pas omettre de consulter cette page avant de créer un nouveau thread :
    http://www.developpez.net/forums/showthread.php?t=9157

    Pour faire avancer le schmimilbilibilibic :
    http://www.developpez.com/delphi/faq...s#testertouche

    Bon dev'

  3. #3
    Expert confirmé
    Avatar de Sub0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2002
    Messages
    3 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Points : 4 219
    Points
    4 219
    Par défaut
    J'utilise ce principe dans ma démo :
    http://sub0.developpez.com/delphi/mouse.zip
    De retour parmis vous après 10 ans!!

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 12
    Points : 12
    Points
    12
    Par défaut
    Bonsoir,

    Merci pour vos réponses rapides, mais je souhaiterais plutôt utiliser une méthode avec notification, car utiliser mon Timer pour interroger Windows régulièrement me paraît un peu gourmand.

    Je pensais en fait à un message Windows de type "WM_" à récupérer dans ma procédure "WndProc", j'ai bien trouvé "WM_MBUTTONDOWN" (http://msdn.microsoft.com/library/de...buttondown.asp) mais il ne concerne que la fenêtre active et ne semble pas être envoyé en mode broadcast à toutes les applications.

    Je vais chercher encore un peu sur MSDN sinon je ré-évaluerai l'idée du Timer.

    Merci,
    Illioc

  5. #5
    Expert confirmé
    Avatar de Sub0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2002
    Messages
    3 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Points : 4 219
    Points
    4 219
    Par défaut
    Dans ce cas, tu ne pourras pas récupérer les messages des autres fenêtres, il faudra obligatoirement que ta form soit au premier plan et active pour que la détection fonctionne. Sinon, il faut développer un hook souris.

    Il faut aussi savoir que les hooks ne sont pas appreciés par les anti-virus...
    De retour parmis vous après 10 ans!!

  6. #6
    Membre régulier
    Inscrit en
    Avril 2005
    Messages
    115
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 115
    Points : 70
    Points
    70
    Par défaut
    J'ai déja développé une application qui détectait les clicks souris ET les touches numériques e, utilisant les timers et je ne trouve pas çela gourmand

  7. #7
    Expert confirmé
    Avatar de Sub0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2002
    Messages
    3 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Points : 4 219
    Points
    4 219
    Par défaut
    Il existe la fonction GetMessage, mais cette détection sera faite dans une boucle, ce qui revient finalement au même qu'utiliser un Timer... Si l'occupation du processeur est vraiment primordiale pour ton application et que tu ne souhaites pas utiliser un hook, essaye déjà de voir ce que consomme GetAsyncKeyState dans un timer avec ce vumètre cpu. Tu peux éventuellement t'en servir pour ajuster l'interval du timer en fonction des ressources cpu disponibles... et/ou de la puissance du processeur installé :
    http://nono40.developpez.com/sources/source0063/

    Tu peux aussi regarder ce qui est dit dans ce topic, sait-on jamais... Evidemment, plus l'interval du timer sera court, plus les ressources du cpu seront nécessaires à ta fonction.
    De retour parmis vous après 10 ans!!

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 12
    Points : 12
    Points
    12
    Par défaut
    Hello,

    Je vais tenter avec un Hook, comme de toutes façons je voulais me mettre aux DLLs, et bien ça me donne une bonne occasion.

    Merci,
    Illioc

  9. #9
    Invité
    Invité(e)
    Par défaut
    Subzero, merci pour ton exemple.

    Moi en effet (je reprends la prog) ai envie de faire un petit soft d'interception clavier/souris (souris principalement) avec un renvoi d'appui d'une touche.

    Principalement c'est pour un jeu, que les koreens ont fait, en oubliant d'ajouter les options de zoom/dezoom pour les joueurs avec une souris 2 bouttons lol (cad - t'as pas la molette, bha tu dezoom, ni zoom pas lol)

    Puis les bouttons sur les côtés de la souris ne sont pas gerés et moi avec ma microsoft j'ai l'habitude de les utiliser donc...

    Mes questions sont les suivantes:

    Comment je peux intercepter l'appuie sur le boutton de coté gauche/droit ou les deux ensemble de ma souris et de renvoyer quasi instantement l'appuie sur les touches 1,2 et 3 du clavier en un laps de temps quasi instantanné aussi (0.5 sec de delai entre chaque boutton du clavier appuié) ?

    Merci de vos réponses!

    [EDiT]

    Zut c'est du délphi... suis sous BC++, ya moyen de transformer le projet? )

  10. #10
    Expert confirmé
    Avatar de Sub0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2002
    Messages
    3 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Points : 4 219
    Points
    4 219
    Par défaut
    Citation Envoyé par ZiKO
    Comment je peux intercepter l'appuie sur le boutton de coté gauche/droit ou les deux ensemble de ma souris et de renvoyer quasi instantement l'appuie sur les touches 1,2 et 3 du clavier en un laps de temps quasi instantanné aussi (0.5 sec de delai entre chaque boutton du clavier appuié) ?
    Oui, je pense que tu n'auras pas de mal, les explications pour Delphi se valent pour BC++ et vis-versa.

    Je n'ai jamais essayé de capturer ces "nouveaux" boutons de ma souris, ces petits boutons qui sont sur le côté et dont je peux définir la fonctionalité via le programme de configuration du constructeur. Sous Windows, les messages standarts sont WM_LBUTTON (left), WM_MBUTTON (middle), WM_RBUTTON (right)... J'imagine qu'il va falloir chercher quels sont ces messages de ces "nouveaux" boutons. Pour cela, j'ai peut-être une solution : Il existe des petits programmes espion genre WinSpector qui peuvent lister les messages systèmes et donc les messages correspondant à l'appui du bouton... Ensuite, pour simuler l'appui des touches du clavier, c'est du gâteau. Donc, pour le moment, ton objectif va être de savoir quels sont les messages générés par ces boutons... En attendant, bon courage, à+
    De retour parmis vous après 10 ans!!

  11. #11
    Invité
    Invité(e)
    Par défaut
    Dur dur ce Winmachin... faut que je le fouille plus profondement.
    J'use le firefox, je clique sur les bouttons, puis je reviens sous le prog, mais bon, il me liste tout le bor*** lol et dificile a trouver quoi que soit lol
    Dernière modification par Droïde Système7 ; 10/02/2007 à 20h10. Motif: Merci de veiller à ne pas utiliser certains mots grossiers...

  12. #12
    Expert confirmé
    Avatar de Sub0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2002
    Messages
    3 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Points : 4 219
    Points
    4 219
    Par défaut
    Le plus difficile dans l'histoire va être de récupérer les messages correspondants à ces boutons suplémentaires. Peut-être bien que Windows a prévu des messages mais je n'en suis pas sûr. Sinon, fait une recherche sur le net ou dans le forum Windows ou Hardware du site...
    De retour parmis vous après 10 ans!!

  13. #13
    Invité
    Invité(e)
    Par défaut
    j'ouvre blocnotes par exemple, je mets a coté de la fenetre des messages de blocnote, je suis sur blocnotes, j'appuis le boutton coté gauche, dans la fenetre des messages je vois:

    -> WM_MOUSEACTIVATE
    <- WM_MOUSEACTIVATE
    -> WM_SETCURSOR
    <- WM_SETCURSOR
    -> WM_APPCOMMAND
    <- WM_APPCOMMAND

    Mais une fois leave blocnotes, ces trucs disparaissent de la liste des messages et du coup je ne peux voir ce qui se passe dans ces commandes sous les "+" à coté

    Sinon peut-être essayer de voir au niveau du driver générique de windows? Vu que je n'ai pas installé aucun driver, ca capte la souris "standard" et ca capte les boutons, donc il doit bien y avoir une function?

    Ou bien, c'est juste tout con: WM_APPCOMMAND, il le capte ainsi, une sorte de commande d'application, comme par exemple IE et Firefox, et Explorer de windows - ces clicks sont "page precedente" et "page suivante"; et donc ces appuis se gerent par les applis? Si c'est le cas, faudra que je me mets au cracking mdr et injecte les params dans l'appli lol - ce qui et super dur pour moi; j'ai essayé sur MK Trilogy PC (trop vieux jeu, mais bon, suis fan de MK aussi ^_^) de virer les screens de intro (trop bete, on peut pas commencer le jeu, ni d'aller configurer les touches clavier, rien, obligé d'attendre que ces logos passent), bien j'ai voulu virer ces logos à la c** et passer l'intro, ben non, trop compliqué pour moi les 0x, les jumps les callbacks, tout en chiffres - incomprehensible

    En tout cas merci pour ton code de mouse, mais surtout la méthode de gestion d'une sorte de hook via le timer je n'ai jamais vu un truc aussi simple et tout c**, qui marche à merveille et n'est pas compliqué du tout!
    Moi c'est ce qu'il me fallait lol Car je n'ai jamais reussi à faire un hook clavier/souris correcte. Soit ca surchargait trop dans la memoire, soit ca plantait, soit ca capté les mauvaises touches, soit ca se dechargait pas de la memoire du tout lol

    Ben, vais fouiller un peu au niveau de hardware
    Dernière modification par Droïde Système7 ; 10/02/2007 à 20h14. Motif: Merci de veiller à ne pas utiliser certains mots grossiers...

  14. #14
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 53
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    Oui, il faut créer une fonction de Hook, et utiliser la fonction de l'API Windows SetWindowsHookEx

    ça permet de demander gentiment à windows de prévenir quand un message souris à lieu, sans avoir à scanner la file des messages périodiquement avec un timer.
    C'est un peu plus "light" pour le système
    Bidouilleuse Delphi

  15. #15
    Expert confirmé
    Avatar de Sub0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2002
    Messages
    3 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Points : 4 219
    Points
    4 219
    Par défaut
    ZiKO : Je vais récupérer une souris de ce genre pour faire des essais. Je te tiens au courant.

    Waskol : Tu as raison. Les hooks sont plus appropriés pour effectuer ce genre de redirection. Un petit bémol cependant à propos des anti-virus qui considèrent qu'un hook est potentiellement dangereux pour le bon fonctionnement du système... La méthode du timer est moins performante, certes, mais reste assez efficace. Elle est surtout plus facile à coder...

    Mais pour l'instant, on ne compte pas scanner tous les messages, on est juste en train de chercher quels messages correspondent à ces boutons.

    à+
    De retour parmis vous après 10 ans!!

  16. #16
    Expert confirmé
    Avatar de Sub0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2002
    Messages
    3 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Points : 4 219
    Points
    4 219
    Par défaut
    Ma souris me retourne ce message : WM_XBUTTONDOWN

    http://msdn.microsoft.com/library/de...buttondown.asp

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Const
      WM_XBUTTONDOWN = 524;  // $20C
      WM_XBUTTONUP   = 523;  // $20B
    [Edit]
    http://www.vbaccelerator.com/home/vb...ks/article.asp
    De retour parmis vous après 10 ans!!

  17. #17
    Expert confirmé
    Avatar de Sub0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2002
    Messages
    3 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Points : 4 219
    Points
    4 219
    Par défaut
    Voici une démo qui fonctionne chez moi. Lorsqu'on clique sur ces boutons cela change la couleur des panels, mais uniquement si le pointeur de la souris est positionné sur la fenêtre du programme. Il va donc falloir soit utiliser un hook, soit dans un timer avec la fonction GetMessage... Cela devrait fonctionner. Pour le moment, j'attend de savoir si ce sont biens les boutons que tu cherchais à détecter...

    http://sub0.developpez.com/delphi/xbutton.zip
    De retour parmis vous après 10 ans!!

  18. #18
    Invité
    Invité(e)
    Par défaut
    Si si, thanks! Ce qu'il me fallait Maintenant reste plus qu'a faire le code pour envoyer l'appuis sur les touches 1, 2 et 3 du clavier =)

    Ben je prefere ce timer pour la facilité de coder, car moi et les hooks, nous ne sommes pas des amis

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 10/01/2014, 09h25
  2. Détecter clic de souris hors form
    Par MrThorr dans le forum VB.NET
    Réponses: 20
    Dernier message: 01/03/2009, 19h28
  3. Réponses: 1
    Dernier message: 14/08/2008, 22h43
  4. Détecter le clic d'une souris sur un webbrowser
    Par sroz dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 06/10/2005, 08h33
  5. Réponses: 8
    Dernier message: 14/03/2005, 21h43

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo