2008-10-17 3 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.

Update: кажется параметр Крючок игнорируется на платформах 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, а также для пожилых Win95 операционных систем на основе должно быть 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 
} 

Это гарантирует, что вы всегда вызывать крюк в конце вашей обработки, и делает трудно случайно добавить return, который будет обходить CallNextHookEx.

+0

Это не работает, потому что CallNextHookEx принимает параметр HHOOK (возвращается из SetWindowsHookEx). – 2008-10-18 13:59:38