Каковы все различия между хуками WH_MOUSE и WH_MOUSE_LL? - PullRequest
4 голосов
/ 16 мая 2009

Я обнаружил, что WH_MOUSE не всегда вызывается. Может быть проблема в том, что я использую WH_MOUSE, а не WH_MOUSE_LL?

Код:

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;
};

1 Ответ

10 голосов
/ 16 мая 2009

Разница в поведении, когда вызывается обратный вызов. Если вы используете низкоуровневую версию, вы не подвергаетесь ограничениям, накладываемым lpfn, из-за способа выполнения вызова вашей функции перехвата. Пожалуйста, прочитайте ниже для получения дополнительной информации. Цитирование из документа MSDN для SetWindowsHookEx:

lpfn [in] Указатель на процедуру подключения. Если параметр dwThreadId равен нулю или указывает идентификатор потока, созданного другим процессом, параметр lpfn должен указывать на подключаемую процедуру в DLL. В противном случае lpfn может указывать на подключаемую процедуру в коде, связанном с текущим процессом.

и от LowLevelKeyboardProc:

хук WH_KEYBOARD_LL не внедряется в другой процесс. Вместо этого контекст переключается обратно на процесс, который установил хук, и он вызывается в своем первоначальном контексте. Затем контекст переключается обратно на приложение, которое сгенерировало событие.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...