7

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

1 に答える 1

11

違いは、コールバックが呼び出されたときの動作にあります。低レベル バージョンを使用している場合は、フック関数の呼び出しが実行される方法により、lpfn によって課される制限が発生しません。詳細については、以下をお読みください。SetWindowsHookEx の MSDN のドキュメントからの引用:

lpfn [in] フック プロシージャへのポインタ。dwThreadId パラメータがゼロであるか、別のプロセスによって作成されたスレッドの識別子を指定している場合、lpfn パラメータは DLL 内のフック プロシージャを指している必要があります。それ以外の場合、lpfn は、現在のプロセスに関連付けられたコード内のフック プロシージャを指すことができます。

および LowLevelKeyboardProc から:

WH_KEYBOARD_LL フックは別のプロセスに挿入されません。代わりに、コンテキストはフックをインストールしたプロセスに戻り、元のコンテキストで呼び出されます。その後、コンテキストは、イベントを生成したアプリケーションに戻ります。
于 2009-05-16T16:13:06.470 に答える