Question

J'ai trouvé que n'est pas toujours WH_MOUSE appelé. Pourrait être le problème que j'utilise et non WH_MOUSE_LL <=>?

Le code:

class MouseHook
{
public:
  static signal<void(UINT, const MOUSEHOOKSTRUCT&)> clickEvent;

  static bool install() 
  {
    if (isInstalled()) return true;
    hook = ::SetWindowsHookEx(WH_MOUSE, (HOOKPROC)&mouseProc,  
                                ::GetModuleHandle(NULL), NULL);
    return(hook != NULL);
  }

  static bool uninstall() 
  {
    if (hook == NULL) return TRUE;
    bool fOk = ::UnhookWindowsHookEx(hook);
    hook = NULL;
    return fOk != FALSE;
  }

  static bool isInstalled() { return hook != NULL; }

private:
   static LRESULT CALLBACK mouseProc(int nCode, WPARAM wParam, LPARAM lParam)
   {            
      if (nCode == HC_ACTION && 
        (wParam == WM_LBUTTONDOWN || wParam == WM_NCLBUTTONDOWN ||
         wParam == WM_RBUTTONDOWN || wParam == WM_NCRBUTTONDOWN ||
         wParam == WM_MBUTTONDOWN || wParam == WM_NCMBUTTONDOWN ))
      {
        MOUSEHOOKSTRUCT* mhs = (MOUSEHOOKSTRUCT*) lParam;
        clickEvent(wParam, *mhs);
      }         

      return ::CallNextHookEx(hook, nCode, wParam, lParam);
    }

   static HHOOK hook;
};
Était-ce utile?

La solution

La différence est dans le comportement lorsque le rappel est appelé. Si vous utilisez la version lowlevel vous ne subissez pas dans les limites posées par lpfn en raison de la façon dont l'appel à votre fonction de crochet est réalisée. Veuillez lire ci-dessous pour plus d'informations. Je cite la doc de MSDN pour SetWindowsHookEx:

lpfn [In] Pointeur sur la procédure de raccordement. Si le paramètre est égal à zéro ou dwThreadId spécifie l'identificateur d'un fil créé par un procédé différent, le paramètre lpfn doit pointer vers une procédure de raccordement dans une DLL. Dans le cas contraire, lpfn peut pointer vers une procédure de raccordement dans le code associé au processus en cours.

et de LowLevelKeyboardProc:

le crochet de WH_KEYBOARD_LL n'a pas été injecté dans un autre processus. Au lieu de cela, le contexte revient au processus qui a installé le crochet et il est appelé dans son contexte original. Ensuite, le contexte revient à l'application qui a généré l'événement.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top