Как правильно использовать SetWindowsHookEx & CallNextHookEx

Я узнал, где проблема. Моя модель состоит из одной внутренней модели и нескольких слоев. Когда я создаю функцию, мой вход поступает от внешней модели, но вывод от внутренней модели, что вызывает разрыв между входом и выходом. Я просто изменил исходный ввод на входной слой внутренней модели, и он работает.

8
задан Mark Ingram 18 October 2008 в 19:33
поделиться

1 ответ

Согласно документам, правильный поступок является передачей аргументы, которые Вы получили непосредственно к CallNextHookEx, точно как Вы получили их. Необходимо также назвать CallNextHookEx независимо от того, решили ли Вы обработать сообщение рычага.

Согласно 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
}

Это удостоверяется, что Вы всегда называете рычаг в конце своей обработки, и мешает случайно добавлять a return это обойдет CallNextHookEx.

10
ответ дан 5 December 2019 в 17:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: