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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    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 : 43
    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
    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.

  2. #2
    Membre éprouvé
    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 : 43
    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
    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

  3. #3
    Membre éprouvé
    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 : 43
    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
    Par défaut
    Nouvelles tentatives avec réalisation de hook de messages et de winevents, avec les mêmes résultats

  4. #4
    Membre éprouvé
    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 : 43
    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
    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).

  5. #5
    Membre éprouvé
    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 : 43
    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
    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

  6. #6
    Membre confirmé
    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
    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

+ 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