2009-05-16 4 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

이제는 분명합니다. 정말 고마워요! –

관련 문제