2008-10-17 5 views
8

Windows 훅을 올바르게 설정할 수 있지만 MSDN의 "CallNextHookEx 함수를 호출하여 다음 훅 프로 시저로 연결하는 옵션은 선택 사항이지만 매우 권장됩니다. 그렇지 않으면 후크를 설치 한 다른 응용 프로그램은 후크 알림을받지 못하고 결과적으로 잘못 작동 할 수 있으므로 다른 응용 프로그램에서 알림이 표시되지 않도록해야하는 경우가 아니라면 CallNextHookEx를 호출해야합니다. "SetWindowsHookEx 및 CallNextHookEx를 올바르게 사용하는 방법

나는 좋은 프로그래밍 시민이되고 다음 걸음을 불러. 하지만 내 후크 절차는 다음과 같습니다.

LRESULT CALLBACK CBTProc(int code, WPARAM wp, LPARAM lp) 
{ 
    if (code != HCBT_CREATEWND) 
     { 
       // What do I do here? It's not the event I requested so how do I pass it on? 
     return 0; 
    } 

    // It's the code we want (create window) 
     CallNextHookEx(...); 
     ... 
} 

코드에 관심이없는 경우 어떻게됩니까? 다음 걸음을 어떻게 부르죠?

편집 : 주된 문제는 HHOOK가 SetWindowsHookEx에서 반환되고 CallNextHookEx 함수에 전달되어야한다는 것입니다.

업데이트 : 그것은 후크 매개 변수는 NT 플랫폼에서 무시됩니다 보인다
http://msdn.microsoft.com/en-us/library/ms644974.aspx
http://www.klenotic.com/pl/null_hhook/

답변

10

이 문서에 따르면, 할 수있는 적절한 것은 당신이 CallNextHookEx에 직접받은 인수를 전달하고, 당신이받은대로. 후크 메시지를 처리하기로 결정했는지 여부에 관계없이 CallNextHookEx를 호출해야합니다.

According to MSDN

CallNextHookEx 첫 번째 매개 변수는 NT/XP/2003에 대한 무시, 세 윈 95 기반 운영 시스템이 있어야 HHOOK 당신이 SetWindowsHookEx와 훅을 등록 할 때 받았다. 문서는 Windows 2000에 대한 값을 지정하지 않지만 NT 계열의 일부이기 때문에 무시됩니다.

감안할 때 모두, NT-제품군 운영 체제에 대한 방법을 코딩하는 좋은 방법이 될 수 있습니다

LRESULT CALLBACK CBTProc(int code, WPARAM wp, LPARAM lp) 
{ 
    if(code == HCBT_CREATEWND) 
     ProcessCreateWnd(wp, lp); 
    return CallNextHookEx(0, code, wp, lp); 
} 

void ProcessCreateWnd(WPARAM wp, LPARAM lp) 
{ 
    // my code here 
} 

이것은 당신은 항상 당신의 처리의 끝 부분에 후크를 호출 있는지 확인합니다 및 차종 실수로 CallNextHookEx을 우회하는 return을 추가하는 것은 어렵습니다.

+0

CallNextHookEx가 (SetWindowsHookEx에서 반환 된) HHOOK 매개 변수를 사용하기 때문에 작동하지 않습니다. –

+0

죄송합니다. 답변을 업데이트하겠습니다. – Charlie

+0

흠, 거기에 뭔가있을 수 있습니다. 나는 NT/XP/2003에서 무시되는 "hhk"매개 변수에 대해 조금 빗나갔습니다. 이제 약간의 테스트를 할 것입니다. –

관련 문제