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

Windows Discussion :

Comment connaître l'état du curseur de la souris ?


Sujet :

Windows

  1. #1
    Membre du Club
    Profil pro
    Développeur mobile
    Inscrit en
    Novembre 2007
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur mobile

    Informations forums :
    Inscription : Novembre 2007
    Messages : 107
    Points : 58
    Points
    58
    Par défaut Comment connaître l'état du curseur de la souris ?
    Bonjour,

    Je souhaiterais simplement savoir quand le curseur de ma souris prend la forme du curseur de saisie (I-beam), comme quand on est au-dessus d'un champ de saisie de texte.

    J'ai regardé du côté de GetCursor() et GetCursorInfo(), ainsi qu'un message sur le forum traitant apparemment du même sujet (http://www.developpez.net/forums/d84...urseur-souris/), mais étant débutant en C++ et API WIN32, et malgré mes recherches, je ne sais pas trop comment faire.

    Merci par avance pour votre aide !

  2. #2
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    Tu as déjà les bonnes fonctions, du moins par rapport à ta question. Cependant, nous ne saurons mieux t'aider sans que tu nous dises ton véritable but. Que cherches-tu à faire exactement ?

  3. #3
    Membre du Club
    Profil pro
    Développeur mobile
    Inscrit en
    Novembre 2007
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur mobile

    Informations forums :
    Inscription : Novembre 2007
    Messages : 107
    Points : 58
    Points
    58
    Par défaut
    Bonjour,

    Je souhaite en fait savoir quand l'utilisateur sélectionne un texte sélectionnable, ou bien quand il donne le focus à une zone de saisie, et ce, sur n'importe quelle application Windows, un peu comme sur certains téléphones mobiles à écran tactile, où un clavier s'affiche dès qu'on sélectionne un champ de saisie de texte.

    L'objectif derrière tout ça est d'également réaliser un clavier virtuel (de ce côté là, j'ai quasiment tout ce qu'il me faut) qui puisse s'afficher automatiquement dès que l'utilisateur sélectionne du texte ou donne le focus à une zone de saisie.

    Il y a probablement d'autres moyens que de regarder la forme du curseur de la souris, et je suis ouvert à toute suggestion. Cependant, je trouve que regarder la forme du curseur de souris répond plutôt bien à mon problème et me paraît pas trop compliqué à mettre en place. Sauf que je n'y arrive pas ...

  4. #4
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    Pour ça, il faut créer un hook global, et intercepter les événements EN_SETFOCUS et WM_CTLCOLOREDIT. L'événement EN_SETFOCUS est délenché quand un contrôle EDIT reçoit le focus. Le message WM_CTLCOLOREDIT est envoyé chaque fois qu'un contrôle doit être redessiné. Je pense que le changement de la sélection dans un contrôle EDIT est donc un déclencheur de cet événement, ou alors intercepter directement les WM_PAINT de tous les contrôles EDIT. On peut connaître le texte selectionné dans un contrôle EDIT en lui envoyant le message EM_GETSEL.

  5. #5
    Membre du Club
    Profil pro
    Développeur mobile
    Inscrit en
    Novembre 2007
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur mobile

    Informations forums :
    Inscription : Novembre 2007
    Messages : 107
    Points : 58
    Points
    58
    Par défaut
    Merci pour l'info !

    Mais ayant des connaissances pour le moment limitées en C++ et API WIN32, et n'ayant jamais développé de hook, serait-il possible d'avoir un exemple de code simple en mode console ? Je suis en train de regarder du côté des tutoriaux disponibles, mais j'ai encore beaucoup de mal à y arriver ...

    Merci par avance !

  6. #6
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  7. #7
    Membre du Club
    Profil pro
    Développeur mobile
    Inscrit en
    Novembre 2007
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur mobile

    Informations forums :
    Inscription : Novembre 2007
    Messages : 107
    Points : 58
    Points
    58
    Par défaut
    Merci !

    J'avais déjà regardé certains de ces tutoriaux et je commence doucement à en comprendre le principe. Malheureusement, je ne vois pas comment appliquer soit le conseil de melem (intercepter les événements EN_SETFOCUS et WM_CTLCOLOREDIT), soit le principe expliqué dans ce post (http://www.developpez.net/forums/d84...urseur-souris/) qui explique brièvement comment récupérer la forme du curseur de souris...

    Si quelqu'un pouvait m'expliquer plus en détail comment procéder (en partant peut-être de l'exemple de gRRosminet : http://tcharles.developpez.com/simul/#hooks), ça me dépannerait énormément. Un exemple simple en mode console me suffirait amplement, n'ayant pas besoin de plus, et ayant du mal à appliquer l'exemple de gRRosminet...

    Merci pour votre aide !

  8. #8
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    1. Crée un Call Window Proc Hook pour intercepter les messages Windows qui nous intéressent.

    2. EN_SETFOCUS est une notification encaspulée dans le message WM_COMMAND. C'est donc en fait ce message que tu dois intercepter, par contre tu ne t'intéresseras au message que lorsque le code de notification (le HIWORD du wParam) est égal à EN_SETFOCUS.

    3. Ajoute un traitement de WM_CTLCOLOREDIT dans ton ta Hook Proc.

    Voilà pour intercepter EN_SETFOCUS et WM_CTLCOLOREDIT. Si tu utilises cette méthode, tu n'as pas besoin de chercher à connaître la forme actuelle du curseur, et vice-versa.

    Tu peux être notifié du changement de forme du curseur en scrutant le message WM_SETCURSOR. Tu peux aussi à tout moment récupérer un handle du curseur à l'aide de GetCursorInfo. Connaître la forme actuelle du curseur est cependant une chose assez compliquée. Je ne m'en suis pas rendu compte dès ma première intervention car je n'y ai même pas pensé car comme je te l'ai déjà dit, ce n'est pas avec cette méthode que tu t'en sortiras. En effet, il faut d'abord copier l'image (l'icône) utilisée par le curseur dans un bitmap en mémoire et le comparer avec une liste d'images que l'on connaît. Or on ne peut pas connaître d'avance toutes les images possibles car certaines applications peuvent utiliser des curseurs personnalisés, sans parler du fait que les curseurs peuvent être des animations ... Bref je te dissuade vraiment de t'aventurer dans cette direction là. Je te conseille plutôt de commencer à coder la solution par hook et de poster ici ce que tu as pu concocter, selon ce que tu as pu comprendre, afin que l'on puisse mieux t'éclaircir dans ce qui est encore sombre pour toi.

  9. #9
    Membre du Club
    Profil pro
    Développeur mobile
    Inscrit en
    Novembre 2007
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur mobile

    Informations forums :
    Inscription : Novembre 2007
    Messages : 107
    Points : 58
    Points
    58
    Par défaut
    Merci Melem pour ton aide !

    M'enfin malgré tous mes efforts, je galère encore beaucoup...

    Alors j'essaie déjà de faire fonctionner la notification EN_SETFOCUS. Pour ce faire, dans le code de ma DLL, j'installe le hook :

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    HINSTANCE thismod;
    HHOOK hhk;
    hhk = SetWindowsHookEx(WH_CBT, winProc, thismod, 0);[/B]
     
    Dans winProc, j'ai :
     
    LRESULT CALLBACK winProc(int nCode, WPARAM wParam, LPARAM lParam)
    {
        if(wParam== EN_SETFOCUS)
        {
            MessageBox(NULL, "focus !", "Information", MB_ICONINFORMATION);
        }
        return CallNextHookEx(hhk, nCode, wParam, lParam);
    }

    Et sans grande surprise, il ne se passe rien (cet exemple n'est qu'un essai parmi beaucoup d'autres). Je pense ne pas avoir tout capté, aussi pourrais-tu m'éclairer déjà sur cette partie ?

    Merci par avance !

  10. #10
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Février 2003
    Messages
    43
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2003
    Messages : 43
    Points : 57
    Points
    57
    Par défaut
    D'après http://msdn.microsoft.com/en-us/libr...85(VS.85).aspx, tu dois tester sur HIWORD(wParam), et non sur wParam. Tu peux récupérer l'id du contrôle avec LOWORD(wParam). Ca donnerais :

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    LRESULT CALLBACK winProc(int nCode, WPARAM wParam, LPARAM lParam)
    {
      if ((nCode == WM_COMMAND) && (HIWORD(wParam) == EN_SETFOCUS))
            MessageBox(NULL, "focus !", "Information", MB_ICONINFORMATION);
     
      return CallNextHookEx(hhk, nCode, wParam, lParam);
    }

    Bon courage

  11. #11
    Membre du Club
    Profil pro
    Développeur mobile
    Inscrit en
    Novembre 2007
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur mobile

    Informations forums :
    Inscription : Novembre 2007
    Messages : 107
    Points : 58
    Points
    58
    Par défaut
    Bonjour,

    J'avais effectivement lu ce lien de la msdn, mais manifestement j'étais à côté de la plaque

    Sauf que malheureusement, il ne se passe toujours rien ... Ma question est donc : ai-je créé le bon hook ? Ici la ligne de code qui crée mon hook :

    hhk = SetWindowsHookEx(WH_CBT, winProc, thismod, 0);

    Est-ce que c'est bien WH_CBT que je dois utiliser, ou autre chose ?

    Merci !

  12. #12
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Février 2003
    Messages
    43
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2003
    Messages : 43
    Points : 57
    Points
    57
    Par défaut
    Je n'avais pas fait attention à ça. Tu devrais plutôt utiliser WH_CALLWNDPROC, qui intercepte les messages transmis aux fenêtes *avant* qu'ils ne soient traités.

    Tu auras donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    hhk = SetWindowsHookEx(WH_CALLWNDPROC, winProc, thismod, 0);
    Comment est initialisé thismod? Elle doit pointer obligatoirement vers un HINSTANCE valide.

  13. #13
    Membre du Club
    Profil pro
    Développeur mobile
    Inscrit en
    Novembre 2007
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur mobile

    Informations forums :
    Inscription : Novembre 2007
    Messages : 107
    Points : 58
    Points
    58
    Par défaut
    Merci pour la précision !

    Hélas encore, ça ne marche toujours pas... Aussi je mets à dispo le code source de mon projet (fortement inspiré d'un code source trouvé sur internet). Si quelqu'un voit d'où peut venir le problème, je lui en serais énormément reconnaissant, tant je cherche en vain depuis des jours ...

    Merci encore !!
    Fichiers attachés Fichiers attachés

  14. #14
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Février 2003
    Messages
    43
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2003
    Messages : 43
    Points : 57
    Points
    57
    Par défaut
    Je n'ai pas regarder ton code, mais je me suis aperçu d'une grosse erreur dans ce que je t'ai dis.

    Dans ta fonction de hook, le message est contenu dans le paramètre lParam.

    Tu dois avoir un truc comme ça (voir ici : http://msdn.microsoft.com/en-us/libr...=VS.85%29.aspx)

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    LRESULT CALLBACK winProc(int nCode, WPARAM wParam, LPARAM lParam)
    {
      if (nCode < 0)
        return CallNextHookEx(hhk, nCode, wParam, lParam);
     
      if (lParam)
      {
        CWPSTRUCT * msg = (CWPSTRUCT *) lParam;
        if ((msg->message == WM_COMMAND) && (HIWORD(msg->wParam) == EN_SETFOCUS))
             MessageBox(NULL, "focus !", "Information", MB_ICONINFORMATION);
      }
     
      return CallNextHookEx(hhk, nCode, wParam, lParam);
    }

  15. #15
    Membre du Club
    Profil pro
    Développeur mobile
    Inscrit en
    Novembre 2007
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur mobile

    Informations forums :
    Inscription : Novembre 2007
    Messages : 107
    Points : 58
    Points
    58
    Par défaut
    Merci blinkseb, ça marche effectivement mieux !!

    Cependant, autant le hook fonctionne maintenant très bien sur toutes les zones de saisie de programmes en "code compilé" (comme le Notepad, les champs de saisies Windows, la barre d'adresse IE, les champs de saisies de Photoshop, etc ...), autant le hook ne fonctionne pas sur les zones de saisies de programmes en "code interprété" (les champs de saisies dans du code HTML, dans du Flash, et peut-être même aussi dans du code Java, mais j'ai pas essayé) : il ne se passe rien lorsqu'on donne le focus sur ces champs de saisie ....

    Quelqu'un aurait-il une idée ?

    Encore merci pour votre aide à tous !

Discussions similaires

  1. comment gérer la position du curseur de la souris
    Par colorid dans le forum Langage
    Réponses: 3
    Dernier message: 16/05/2011, 08h54
  2. Réponses: 23
    Dernier message: 04/05/2011, 10h20
  3. Comment connaître l'état du curseur de la souris ?
    Par thenaoh dans le forum Windows
    Réponses: 6
    Dernier message: 23/09/2010, 19h35
  4. Récupérer l'état du curseur de la souris
    Par TheGzD dans le forum MFC
    Réponses: 10
    Dernier message: 23/09/2010, 17h34
  5. Réponses: 2
    Dernier message: 29/03/2006, 11h39

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