2009-05-16 36 views
4

私は、WH_MOUSEが必ずしも呼び出されるとは限りません。問題は私がWH_MOUSEを使用していて、WH_MOUSE_LLを使用していない可能性がありますか?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; 
}; 

答えて

10

コールバックが呼び出されたときに差が行動です。 低レベルバージョンを使用している場合、あなたのフック関数の呼び出しが実行される方法のために、lpfnによって引き起こされる制限がありません。詳細は下記をご覧ください。 SetWindowsHookExについては、MSDNのドキュメントから引用 :

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

とLowLevelKeyboardProcから は:

WH_KEYBOARD_LLフック別のプロセス内に注入されていません。代わりに、コンテキストはフックをインストールしたプロセスに戻り、元のコンテキストで呼び出されます。コンテキストは、イベントを生成したアプリケーションに戻ります。
+0

正しく理解できますか:WH_MOUSEフックを使用している場合は、DLLに実装する必要がありますか? –

+1

そのフックを使用して、その呼び出し以外のプロセスからのイベントを捕捉したい場合のみSetWindowsHookEx – em70

+0

これは明らかです。ありがとうございます! –

関連する問題