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

C++ Discussion :

hook souris, freeze suite au bloquage de click


Sujet :

C++

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 19
    Points : 4
    Points
    4
    Par défaut hook souris, freeze suite au bloquage de click
    Bonjour,
    Possédant une souris 5 boutons, je souhaitais réassigner les deux xbutton.
    Le logiciel fourni ne me convenant pas, j'ai décidé de le coder moi-même.
    Le hook fonctionne correctement, les actions que je demande s'effectuent. Cependant le message de base qui est app_backward et app_forward ne sont pas bloqués.
    Voici mon code:
    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
    56
    57
     
    #define _WIN32_WINNT 0x0501
    #include <windows.h>
     
     
    HHOOK hHook;
    HINSTANCE hExe;
     
    LRESULT CALLBACK HookProc ( int,  WPARAM,  LPARAM );
    MSG message;
     
    int main()
    {
        hExe = GetModuleHandle(0);
        hHook = SetWindowsHookEx( WH_MOUSE_LL, (HOOKPROC) HookProc, hExe, 0);
     
     
     
        while (GetMessage (&message,NULL,0,0))
        {
            TranslateMessage( &message );
            DispatchMessage( &message );
        }
     
        UnhookWindowsHookEx(hHook);
     
        return 0;
    }
     
     
     LRESULT CALLBACK HookProc ( int nCode,  WPARAM wParam,  LPARAM lParam)
    {
     
             if (wParam == WM_XBUTTONDOWN)
     
             {
                MSLLHOOKSTRUCT *mouseInfo = (MSLLHOOKSTRUCT*)lParam;
     
                   if(HIWORD(mouseInfo->mouseData) == XBUTTON1)
                     {
                        ShellExecuteA (NULL, "explore", "c:\\Users\\Default\\AppData\\Roaming\\Microsoft\\Windows\\STARTM~1\\Programs\\Accessories\\SYSTEM~1\\computer.lnk", 0, 0, SW_SHOWNORMAL);                
                     }
     
                   if(HIWORD(mouseInfo->mouseData) == XBUTTON2)
                     {
                        ShellExecuteA (NULL, "open", "firefox", 0, 0, SW_SHOWNORMAL);
                     }
             }
     
             if (wParam == WM_XBUTTONUP)
     
             {
                 //???????????????????
             }
     
         return CallNextHookEx(hHook, nCode, wParam, lParam);
     }
    les messages backward et forward s'effectuant sur le xbuttonup, j'ai essayé de mettre "return 1;" ou "return true;". En effet les messages sont bloqués mais la souris aussi
    Comment puis-je interdire ces messages sans bloquer le hook?

    je vous remercie par avance

  2. #2
    Membre éclairé
    Inscrit en
    Décembre 2010
    Messages
    290
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 290
    Points : 719
    Points
    719
    Par défaut
    Je n'ai jamais programmé avec des hooks, donc j'ai pas forcément un avis intéressant. Toutefois, j'ai remarqué que tu ne testes pas le valeur du nCode, comme recommandé :
    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
     
    LRESULT CALLBACK HookProc ( int nCode,  WPARAM wParam,  LPARAM lParam)
    {
       // j'ai rajouté ces deux lignes :
      if (nCode < 0)
        return CallNextHookEx(hHook, nCode, wParam, lParam);
     
          if (wParam == WM_XBUTTONDOWN)
     
             {
                MSLLHOOKSTRUCT *mouseInfo = (MSLLHOOKSTRUCT*)lParam;
     
                   if(HIWORD(mouseInfo->mouseData) == XBUTTON1)
                     {
                        ShellExecuteA (NULL, "explore", "c:\\Users\\Default\\AppData\\Roaming\\Microsoft\\Windows\\STARTM~1\\Programs\\Accessories\\SYSTEM~1\\computer.lnk", 0, 0, SW_SHOWNORMAL);                
                     }
     
                   if(HIWORD(mouseInfo->mouseData) == XBUTTON2)
                     {
                        ShellExecuteA (NULL, "open", "firefox", 0, 0, SW_SHOWNORMAL);
                     }
             }
     
             if (wParam == WM_XBUTTONUP)
     
             {
                 //???????????????????
             }
     
         return CallNextHookEx(hHook, nCode, wParam, lParam);
    }
    Je n'ai pas trouvé de documentation sur comment windows utilise ce bizarre paramètre, donc je ne sais pas si ça a un rapport avec ce que tu décris.

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 19
    Points : 4
    Points
    4
    Par défaut
    Merci pour ta réponse.
    En effet j'avais mis ces deux lignes au départ puis je les avais enlevées pour voir si ça résolvait mon problème. Je les remets pour être sûr. Cependant cela ne semble pas être lié à mon problème. Je me demande s'il n'y a pas un embouteillage de message, car le xbuttondown et xbuttonup se suivent rapidement, le shellexecute n'est pas fini d'être lancé qu'un nouveau message doit être interprété. Si je bloques les deux en même temps il n'y a pas de problème :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    if (nCode < 0)
             return CallNextHookEx(hHook, nCode, wParam, lParam);
     
             if ((wParam == WM_XBUTTONDOWN) || wparam == WM_XBUTTONUP))
     
             {
                return true;
             }
     
     
         return CallNextHookEx(hHook, nCode, wParam, lParam)
    la souris n'est pas bloquée. C'est uniquement quand je sépare les deux messages. N'y a-t-il pas une façon de traiter les deux messages en même temps, ou de faire patienter le deuxième le temps que le premier soit fini?
    Plus je réfléchis plus je m'embrouille.

  4. #4
    Membre éclairé
    Inscrit en
    Décembre 2010
    Messages
    290
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 290
    Points : 719
    Points
    719
    Par défaut
    Oh heu la doc de microsoft dit ça (http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx) :

    "The hook procedure should process a message in less time than the data entry specified in the LowLevelHooksTimeout value in the following registry key:
    HKEY_CURRENT_USER\Control Panel\Desktop"
    (valeur en millisecondes)

    Du coup effectivement si t'es trop lent pour gérer l'évènement, ça risque de poser des problèmes.
    Pourrais tu avoir un thread qui dort sur un HEVENT, qui serait reveillé par ton hook (signaler un event prend quasiment rien comme temps) et dès son réveil il fait le shellexecute() ??

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 19
    Points : 4
    Points
    4
    Par défaut
    En effet je n'avais pas vu ça, merci.
    Du coup faut que je mettes mon shellexecute dans un thread qui sera activé par un event dans le hook?
    Mon hook doit aussi être dans un thread alors?
    Oulala la seul fois que j'ai fais un thread c'était en Qt, j'espère m'y retrouver en c++.
    En tout cas merci ça me débloque

  6. #6
    Membre éclairé
    Inscrit en
    Décembre 2010
    Messages
    290
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 290
    Points : 719
    Points
    719
    Par défaut
    Non ton hook peut rester dans le thread principal. Au début de ton programme tu appelles CreateEvent(), tu crées ton thread, qui s'endort sur WaitForSingleEvent() puis tu installes ton hook.
    Lorsque ton hook le veut, il doit appeler SetEvent() pour réveiller ton thread.
    Attention : moi c'est comme ça que j'aurais fait, mais je ne promets pas qu'il n'existe pas des façons plus simples de faire un ShellExecute() "asynchrone" depuis un hook.

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 19
    Points : 4
    Points
    4
    Par défaut
    Merci pour toutes ces infos. Je teste ça demain et te dirai ce que ça a donné.
    merci encore.

  8. #8
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 19
    Points : 4
    Points
    4
    Par défaut
    Bonjour,

    A cause des vacances je n'ai pas pu tester plus tôt.
    Donc le thread fonctionne mais ne résout pas mon problème.
    J'ai toujours la souris qui freeze quand je fais "return 1".
    Je vois plus quoi faire.
    Une autre idée peut être?
    merci

    edit:
    Quand j'intercale un "sleep(1000)" avant mon "return 1", je n'ai plu de freeze mais la commande backward ou forward n'est plus bloquée.
    Je pense que je n'arrive pas à surchargée cette commande.

  9. #9
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 19
    Points : 4
    Points
    4
    Par défaut
    J'ai résolu mon problème en exportant mon code dans une autre fonction que j'appelle dans mon 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
     
    LRESULT xb(LPARAM lParam)
    {
        MSLLHOOKSTRUCT *mouseInfo = (MSLLHOOKSTRUCT*)lParam;
     
                    if(HIWORD(mouseInfo->mouseData) == XBUTTON1)
                    {
                        ShellExecuteA (NULL, "explore", "c:\\Users\\Default\\AppData\\Roaming\\Microsoft\\Windows\\STARTM~1\\Programs\\Accessories\\SYSTEM~1\\computer.lnk", 0, 0, SW_SHOWNORMAL);
                    }
     
                    else if(HIWORD(mouseInfo->mouseData) == XBUTTON2)
                    {
                        ShellExecuteA (NULL, "open", "firefox", 0, 0, SW_SHOWNORMAL);
                    }
                    return TRUE;
    }
     
    LRESULT CALLBACK HookProc ( int nCode,  WPARAM wParam,  LPARAM lParam)
    {
         if (nCode == HC_ACTION)
        {
            if (wParam == WM_XBUTTONDOWN)
            {
                return xb(lParam);
            }
     
            if (wParam == WM_XBUTTONUP)
            {
                return 1;
            }
        }
        return CallNextHookEx(hHook, nCode, wParam, lParam);
    }

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

Discussions similaires

  1. [Vista, Fwk 2.0] Hook souris local ne fonctionnant pas
    Par olsimare dans le forum Windows Forms
    Réponses: 2
    Dernier message: 13/11/2012, 16h28
  2. hook souris et message non envoyer
    Par mapmip dans le forum Access
    Réponses: 1
    Dernier message: 18/01/2008, 23h01
  3. Java natif & hook souris Windows
    Par ®om dans le forum Langage
    Réponses: 1
    Dernier message: 18/07/2006, 22h39
  4. Probleme de Hook souris
    Par mandagor dans le forum MFC
    Réponses: 17
    Dernier message: 07/07/2005, 17h12

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