Хуки Windows

  • Автор темы Guest
  • Дата начала
Статус
Закрыто для дальнейших ответов.
G

Guest

Гость
#1
Хуки Windows
Итак, у меня проблема с WH_CALLWNDPROC и WH_MSGFILTER хуками.
Вот функция моего хука:
Код:
LRESULT CALLBACK HookProc(DWORD nCode,WPARAM wParam,LPARAM lParam) 
{ 
  CallNextHookEx(hHook,nCode,wParam,lParam); 
return 0; 
} 


Вот функция установливающая Hook: 
void Install() 
{ 
 hInstance=GetModuleHandle(NULL);// Когда я ставлю вместо hInstance ноль то проблема тоже остаётся. 
 hHook=SetWindowsHookEx(WH_MSGFILTER,(HOOKPROC)&HookProc,hInstance,0); 
} 

И функция убирающая Hook: 

void Unistall() 
{ 
UnhookWindowsHookEx(hHook); 
} 

Ну и DLL Main: 

BOOL APIENTRY DllMain( HANDLE hModule,DWORD ul_reason_for_call,LPVOID lpReserved) 
{ 
 return TRUE; 
}
Так вот: Этот хук как вы заметили отлавливает сообщения выбора пункта меню (ну и ещё несколько событий) во всей системе.
Но когда я ставлю этот хук и нажимаю скажем в калькуляторе на меню, то у меня выскакивает ошибка:
"Программа выполнила недопустимую операцию и будет закрыта" и закрывется калькулятор.
Когда я ставлю хук WH_KEYBOARD, то всё нормально работает!
Если это имеет значения я пишу под Win95 с установленным IE 5.0
В чём дело?
 

Гость
#2
Guest
Вои цитата из MSDN:
If code is less than zero, the hook procedure must return the value returned by CallNextHookEx.

If code is greater than or equal to zero, and the hook procedure did not process the message, it is highly recommended that you call CallNextHookEx and return the value it returns; otherwise, other applications that have installed WH_MSGFILTER hooks will not receive hook notifications and may behave incorrectly as a result. If the hook procedure processed the message, it may return a nonzero value to prevent the system from passing the message to the rest of the hook chain or the target window procedure.
Собственно они настоятельно рекомендуют возвращать то, что вернул CallNextHookEx. А ты, судя по коду, возвращаешь 0.

Гуд бай ламерzzzz ^)
 
Статус
Закрыто для дальнейших ответов.