문제

Windows 후크를 올바르게 설정할 수는 있지만 MSDN의 라인에 의해 "다음 후크 프로 시저에 체인으로 CallnexThookex 기능을 호출하는 것이 선택 사항이지만 강력히 권장됩니다. 그렇지 않으면 후크를 설치 한 다른 응용 프로그램은 후크 알림을받지 않으면 결과적으로 잘못 행동 할 수 있습니다. 다른 응용 프로그램에서 알림이 절대적으로 보이지 않으면 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/

도움이 되었습니까?

해결책

문서에 따르면, 적절한 일은 당신이받은대로 당신이 직접받은 주장을 CallnexThookex에 전달하는 것입니다. 후크 메시지를 처리하기로 결정했는지 여부에 관계없이 CallnexThookex에 전화해야합니다.

MSDN에 따르면, 첫 번째 매개 변수 CallNextHookEx NT/XP/2003에서 무시되며 구형 Win95 기반 운영 체제의 경우 HHOOK 후크를 등록했을 때 받았습니다 SetWindowsHookEx. 문서는 Windows 2000의 값을 지정하지 않지만 NT 제품군의 일부이기 때문에 합리적인 추측은 그곳에서도 무시된다는 것입니다.

이 모든 것을 감안할 때, NT-Family 운영 체제를위한 방법을 코딩하는 좋은 방법은 다음과 같습니다.

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
}

이렇게하면 처리가 끝날 때 항상 후크를 호출하고 실수로 추가하기가 어렵습니다. return 우회 할 것입니다 CallNextHookEx.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top