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

MFC Discussion :

Récupérer l'état du curseur de la souris


Sujet :

MFC

  1. #1
    Membre émérite
    Avatar de TheGzD
    Homme Profil pro
    Ingénieur/ Docteur en Informatique
    Inscrit en
    Avril 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur/ Docteur en Informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 327
    Points : 2 677
    Points
    2 677
    Par défaut Récupérer l'état du curseur de la souris
    Bonjour,

    j'aurai aimé savoir comment récupérer l'ID couramment utilisée pour la souris.
    Voici l'ensemble des valeurs dans lequel je souhaite récupérer les ID (source MSDN) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    IDC_APPSTARTING Standard arrow and small hourglass
    IDC_ARROW Standard arrow
    IDC_CROSS Crosshair
    IDC_HAND Windows 98/Me, Windows 2000/XP: Hand
    IDC_HELP Arrow and question mark
    IDC_IBEAM I-beam
    IDC_ICON Obsolete for applications marked version 4.0 or later.
    IDC_NO Slashed circle
    IDC_SIZE Obsolete for applications marked version 4.0 or later. Use IDC_SIZEALL.
    IDC_SIZEALL Four-pointed arrow pointing north, south, east, and west 
    IDC_SIZENESW Double-pointed arrow pointing northeast and southwest 
    IDC_SIZENS Double-pointed arrow pointing north and south
    IDC_SIZENWSE Double-pointed arrow pointing northwest and southeast 
    IDC_SIZEWE Double-pointed arrow pointing west and east
    IDC_UPARROW Vertical arrow
    IDC_WAIT Hourglass
    Dans WinUser.h on peut voir leurs définitions :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    /*
     * Standard Cursor IDs
     */
    #define IDC_ARROW           MAKEINTRESOURCE(32512)
    #define IDC_IBEAM           MAKEINTRESOURCE(32513)
    #define IDC_WAIT            MAKEINTRESOURCE(32514)
    #define IDC_CROSS           MAKEINTRESOURCE(32515)
    #define IDC_UPARROW         MAKEINTRESOURCE(32516)
    #define IDC_SIZE            MAKEINTRESOURCE(32640)  /* OBSOLETE: use IDC_SIZEALL */
    #define IDC_ICON            MAKEINTRESOURCE(32641)  /* OBSOLETE: use IDC_ARROW */
    #define IDC_SIZENWSE        MAKEINTRESOURCE(32642)
    #define IDC_SIZENESW        MAKEINTRESOURCE(32643)
    #define IDC_SIZEWE          MAKEINTRESOURCE(32644)
    #define IDC_SIZENS          MAKEINTRESOURCE(32645)
    #define IDC_SIZEALL         MAKEINTRESOURCE(32646)
    #define IDC_NO              MAKEINTRESOURCE(32648) /*not in win3.1 */
    #if(WINVER >= 0x0500)
    #define IDC_HAND            MAKEINTRESOURCE(32649)
    #endif /* WINVER >= 0x0500 */
    #define IDC_APPSTARTING     MAKEINTRESOURCE(32650) /*not in win3.1 */
    #if(WINVER >= 0x0400)
    #define IDC_HELP            MAKEINTRESOURCE(32651)
    #endif /* WINVER >= 0x0400 */
    J'ai eu beau chercher je n'ai pas trouvé ...
    Si quelqu'un sait comment récupérer cet état à n'importe quel moment, je suis tout ouïe

    Merci d'avance.
    Vous postez du code ? Merci d'utiliser les balises
    Un message vous paraît pertinent ? Merci de le gratifier d'un vote positif
    Vous avez obtenu une réponse à votre question ? Merci d'utiliser le tag
    __________________
    Ingénieur R&D, diplômé en 2007 de l'ISIMA
    Docteur en informatique, diplômé en 2015 de l'EDSPI de Clermont-Ferrand

  2. #2
    Membre émérite
    Avatar de TheGzD
    Homme Profil pro
    Ingénieur/ Docteur en Informatique
    Inscrit en
    Avril 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur/ Docteur en Informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 327
    Points : 2 677
    Points
    2 677
    Par défaut
    A l'heure actuelle le seul moyen que j'ai trouvé pour récupérer cet ID est de comparer le curseur courant, que je récupère de la façon suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        CURSORINFO ci;
        ci.cbSize = sizeof(CURSORINFO);
        ::GetCursorInfo(&ci);
        HCURSOR temp = ci.hCursor;
    aux curseurs standards
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ::AfxGetApp()->LoadStandardCursor(IDC_APPSTARTING)
    (à faire pour tous les ID) et si ça correspond j'en déduis l'ID couramment utilisée.

    Non seulement ce n'est pas terrible en terme de temps d'exécution, mais je ne peux ainsi déterminer un changement d'ID qu'une fois que ce dernier a été appliqué, alors que j'aurai besoin de savoir quand le système va/veut changer. Cette technique à donc un petit temps de retard par rapport à ce dont j'aurai besoin
    => si quelqu'un a mieux je suis preneur
    Vous postez du code ? Merci d'utiliser les balises
    Un message vous paraît pertinent ? Merci de le gratifier d'un vote positif
    Vous avez obtenu une réponse à votre question ? Merci d'utiliser le tag
    __________________
    Ingénieur R&D, diplômé en 2007 de l'ISIMA
    Docteur en informatique, diplômé en 2015 de l'EDSPI de Clermont-Ferrand

  3. #3
    Membre émérite
    Avatar de TheGzD
    Homme Profil pro
    Ingénieur/ Docteur en Informatique
    Inscrit en
    Avril 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur/ Docteur en Informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 327
    Points : 2 677
    Points
    2 677
    Par défaut
    Nouvelles tentatives avec réalisation de hook de messages et de winevents, avec les mêmes résultats
    Vous postez du code ? Merci d'utiliser les balises
    Un message vous paraît pertinent ? Merci de le gratifier d'un vote positif
    Vous avez obtenu une réponse à votre question ? Merci d'utiliser le tag
    __________________
    Ingénieur R&D, diplômé en 2007 de l'ISIMA
    Docteur en informatique, diplômé en 2015 de l'EDSPI de Clermont-Ferrand

  4. #4
    Membre émérite
    Avatar de TheGzD
    Homme Profil pro
    Ingénieur/ Docteur en Informatique
    Inscrit en
    Avril 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur/ Docteur en Informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 327
    Points : 2 677
    Points
    2 677
    Par défaut
    Finalement avec un hook de winevents on peut s'informer des changements d'ID du curseur, puis retrouver de quel ID il s'agit en comparent le HCURSOR en cours d'utilisation avec ceux dits "standards" (récupérés avec LoadStandardCursor).
    Vous postez du code ? Merci d'utiliser les balises
    Un message vous paraît pertinent ? Merci de le gratifier d'un vote positif
    Vous avez obtenu une réponse à votre question ? Merci d'utiliser le tag
    __________________
    Ingénieur R&D, diplômé en 2007 de l'ISIMA
    Docteur en informatique, diplômé en 2015 de l'EDSPI de Clermont-Ferrand

  5. #5
    Membre émérite
    Avatar de TheGzD
    Homme Profil pro
    Ingénieur/ Docteur en Informatique
    Inscrit en
    Avril 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur/ Docteur en Informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 327
    Points : 2 677
    Points
    2 677
    Par défaut
    Vu qu'on m'a demandé quelques précisions en mp, voici le code du hook :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    char currentCursorName[256];
     
    void CALLBACK WinEventProc(HWINEVENTHOOK hEvent, DWORD event, HWND hwndMsg, LONG idObject, LONG idChild, DWORD idThread, DWORD dwmsEventTime)
    {
        // If idObject is not OBJID_CURSOR we return
        if(idObject != OBJID_CURSOR)
            return;
     
        char bufferName[256];
        IAccessible *pacc=NULL;
        VARIANT varChild;
        VariantInit(&varChild);
     
        // Get a pointer to IAccessible and a child ID for the event
        HRESULT hr = AccessibleObjectFromEvent(hwndMsg, idObject, idChild, &pacc, &varChild);
     
        if(!SUCCEEDED(hr))
        {
            VariantClear(&varChild);
            return;
        }
     
        VARIANT varRetVal;
     
        // Get the role and verify that the event corresponds to the cursor
        hr = pacc->get_accRole(varChild, &varRetVal);
     
        if (hr != S_OK || varRetVal.vt != VT_I4 || varRetVal.lVal != ROLE_SYSTEM_CURSOR)
        {
            pacc->Release();
            return;
        }
     
        // Get the name of the cursor
        BSTR bstrName;
        hr = pacc->get_accName(varChild, &bstrName);
     
        if (hr == S_OK && bstrName)
        {
            WideCharToMultiByte(CP_ACP, 0, bstrName, -1, bufferName, sizeof(bufferName), NULL, NULL);
            SysFreeString(bstrName);
        }
        else
            lstrcpyn(bufferName, "unknown name", sizeof(bufferName));
     
        // Verify if the name is the requested one
        // Note that this comparison will not work on localized builds
        if(!strstr(bufferName, currentCursorName))
            //TODO : cursor has changed => here do what you have to !
     
        strncpy_s(currentCursorName, 256, bufferName, 256);
        pacc->Release();
     
        return;
    }
    Pour accrocher le hook : (à placer dans l'initialisation du programme)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    HWINEVENTHOOK hEventHook = SetWinEventHook(
            EVENT_OBJECT_NAMECHANGE,
            EVENT_OBJECT_NAMECHANGE,         //end event id
            NULL,          //always NULL for outprocess hook
            WinEventProc,
            0,             //hooked into
            0,             //hooked into
            WINEVENT_OUTOFCONTEXT);
    Pour le décrocher :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UnhookWinEvent(hEventHook);
    Une fois qu'on a le nom du curseur (récupéré dans la variable globale currentCursorName) c'est gagné (voir "TODO" dans le code). Cependant on récupérera ce changement un "delta t", après qu'il ait eu lieu ...

    Bonne chance
    Vous postez du code ? Merci d'utiliser les balises
    Un message vous paraît pertinent ? Merci de le gratifier d'un vote positif
    Vous avez obtenu une réponse à votre question ? Merci d'utiliser le tag
    __________________
    Ingénieur R&D, diplômé en 2007 de l'ISIMA
    Docteur en informatique, diplômé en 2015 de l'EDSPI de Clermont-Ferrand

  6. #6
    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 TheGzD, et merci pour ces précisions !

    Malheureusement, je ne parviens pas à faire fonctionner ton code, mes connaissances en C++ et API WIN32 étant encore limitées, malgré les journées entières que je passe à me documenter sur le sujet.

    Serait-ce possible, si ça n'est pas trop te demander, de mettre à dispo un petit projet simple mettant en application ton code, afin que je puisse mieux comprendre ? ça pourrait me débloquer et ça m'aiderait énormément.

    Merci par avance

  7. #7
    Membre émérite
    Avatar de TheGzD
    Homme Profil pro
    Ingénieur/ Docteur en Informatique
    Inscrit en
    Avril 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur/ Docteur en Informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 327
    Points : 2 677
    Points
    2 677
    Par défaut
    Le code que je t'ai fourni permet de définir et d'accrocher un hook de type HWINEVENTHOOK : fait des recherches la-dessus pour comprendre exactement comment ça marche, le reste je te l'ai déjà donné.
    Vous postez du code ? Merci d'utiliser les balises
    Un message vous paraît pertinent ? Merci de le gratifier d'un vote positif
    Vous avez obtenu une réponse à votre question ? Merci d'utiliser le tag
    __________________
    Ingénieur R&D, diplômé en 2007 de l'ISIMA
    Docteur en informatique, diplômé en 2015 de l'EDSPI de Clermont-Ferrand

  8. #8
    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 me permets de revenir vers toi concernant la détection de la forme du curseur de souris, et la solution que tu m'as proposée.

    Je me penche de nouveau sur le sujet, et j'ai effectué de nombreuses recherches concernant l'implémentation de ton code, mais sans succès.

    Aussi, et ce n'est pas par flemme que je te demande ça, c'est bien parce que j'y passe des journées entières à chercher en vain, pourrais-tu me donner un exemple de code implémentant ce que tu m'as déjà proposé ? (pour rappel, je cherche à savoir quand le curseur de la souris prend la forme I-Beam)

    Merci par avance pour ton aide !

  9. #9
    Membre émérite
    Avatar de TheGzD
    Homme Profil pro
    Ingénieur/ Docteur en Informatique
    Inscrit en
    Avril 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur/ Docteur en Informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 327
    Points : 2 677
    Points
    2 677
    Par défaut
    Salut !

    Je ne comprends pas trop ce qui te pose problème. En effet je t'ai vraiment tout donné et je ne vois pas trop qu'ajouter d'autre

    Je vais qd même te récapituler les étapes à mettre à place (pour le code voir un peu plus haut) :

    - récupérer les messages du système concernant le changement d'état du curseur, pour cela :

    • décrire le traitement que tu vas faire quand tu recevras ton message (voir le code du hook et faire ta comparaison avec I-beam à proximité du "TODO" : pour info le nom du curseur est stocké dans la variable currentCursorName)
    • ensuite tu accroches ton hook pour que la fonction que tu as décrite précédemment soit appelée qd les messages qui nous intéressent sont générés (à faire dans l'initialisation de ton application ou de ta dialog)
    • ne pas oublier de se décrocher proprement (dans l'exitinstance ou le destroywindow)

    (NB : ces 3 points reprennent dans le même ordre les 3 bouts de code que j'ai déjà posté)

    -implémenter les traitements à réaliser sous forme de méthode static,car il te faudra les appeler dans la fonction du hook qui n'est pas un méthode de classe !

    En clair tu copies-colles tout ce que je t'ai déjà donné (et tu rajoutes les qqs déclarations qui peuvent manquer), puis tu implémentes le traitement à faire dans le cas où le curseur devient un I-beam (je ne me souviens plus de la valeur de la chaine de caractères pour le I-beam, mais dans un premier temps récupère les chaines bêtement et tu le sauras vite), traitement que tu appelleras à proximité du "TODO" dans le code du hook.

    Ça va aller ?
    Vous postez du code ? Merci d'utiliser les balises
    Un message vous paraît pertinent ? Merci de le gratifier d'un vote positif
    Vous avez obtenu une réponse à votre question ? Merci d'utiliser le tag
    __________________
    Ingénieur R&D, diplômé en 2007 de l'ISIMA
    Docteur en informatique, diplômé en 2015 de l'EDSPI de Clermont-Ferrand

  10. #10
    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
    Ok, merci pour ces précisions, je vais essayer de faire fonctionner tout ça. Promis je ne t'embête plus

  11. #11
    Membre émérite
    Avatar de TheGzD
    Homme Profil pro
    Ingénieur/ Docteur en Informatique
    Inscrit en
    Avril 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur/ Docteur en Informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 327
    Points : 2 677
    Points
    2 677
    Par défaut
    Tu ne m'embêtes pas ne te fait pas de soucis, mais concernant le fonctionnement général je ne peux t'en dire guère plus que ce que j'ai déjà fait

    Après si tu as des questions techniques précises n'hésite pas à demander.

    Bon courage.
    Vous postez du code ? Merci d'utiliser les balises
    Un message vous paraît pertinent ? Merci de le gratifier d'un vote positif
    Vous avez obtenu une réponse à votre question ? Merci d'utiliser le tag
    __________________
    Ingénieur R&D, diplômé en 2007 de l'ISIMA
    Docteur en informatique, diplômé en 2015 de l'EDSPI de Clermont-Ferrand

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

Discussions similaires

  1. 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
  2. Comment connaître l'état du curseur de la souris ?
    Par thenaoh dans le forum Windows
    Réponses: 14
    Dernier message: 15/06/2010, 11h11
  3. reposition du curseur de la souris!
    Par bakonu dans le forum Windows
    Réponses: 2
    Dernier message: 09/06/2004, 18h17
  4. [TP][FAQ]Curseur de la souris
    Par nounetmasque dans le forum Turbo Pascal
    Réponses: 5
    Dernier message: 29/06/2003, 23h22
  5. Comment masquer le curseur de la souris ?
    Par benj63 dans le forum C++Builder
    Réponses: 4
    Dernier message: 26/06/2002, 18h54

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