setwindowshookex & callnexthookex를 올바르게 사용하는 방법
문제
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
.