Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Хуки Windows

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки

Открыть новую тему     Написать ответ в эту тему

MAX_DAMAGE



Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Хуки 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
В чём дело?

Всего записей: 258 | Зарегистр. 10-04-2002 | Отправлено: 11:28 23-12-2003 | Исправлено: MAX_DAMAGE, 11:29 23-12-2003
ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Попробуй вначале скомпилировать примеры приведенные в Ms SDK там точно рабочие вещи. Я их переводил в дельфи и вешал на закрытие приложения. Все работало. Посмотри по теме Monitoring System Events

----------
И создал Бог женщину... Существо получилось злобное, но забавное...

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 01:56 24-12-2003
drobitko

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Вои цитата из 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.

Всего записей: 83 | Зарегистр. 10-02-2003 | Отправлено: 16:16 24-12-2003
MAX_DAMAGE



Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Без разницы. Я по разному пробывал. Всеравно ошибка.
А да прикол! У людей не с Win95 всё пашет! А у меня нет...

Всего записей: 258 | Зарегистр. 10-04-2002 | Отправлено: 16:54 25-12-2003
ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Скорее всего проблема в винде. У меня тоже прога мною написаная по Вынь2К работает без проблем, а под 98 через раз. Причем при одних и тех же условиях

----------
И создал Бог женщину... Существо получилось злобное, но забавное...

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 02:51 26-12-2003
ollv

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Это все в длленине ?

Всего записей: 165 | Зарегистр. 25-12-2003 | Отправлено: 14:48 26-12-2003
MAX_DAMAGE



Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Кажется я разобрался в чем дело!
Вобщем сделал я аналогичный проет в Дельфах. И все заработало! Только с большими тормозами. в Дельфи dll размером около 30 кб в Visual C++ - около 150. Вобщем видимо када я пишу на C++ моя БОЛЬШАЯ DLL очень грузит треды, в результате чего происходит закртие приложения с ошибкой.
НО! Как только я заменил hInstance=GetModuleHandle(NULL) на hInstance=GetModuleHandle("имя_длл.dll") то в Delphi тормоза пропали и длл скомпилиная под Visual C++ тожа без проблем ЗАРАБОТАЛА!
Вобщем методом тыка проблема решена!
 
Вот мое ламерское мнение: видимо когда мы указываем в GetModuleHandle NULL, то винда начинает слать какие-нить свои внутренние сообщения о срабатывании хука (я не имею ввиду WM_разные_сообщения) всем потокам куда вклинился наш хук (а при WH_GETMESSAGE этих сообщения очень много будет), а когда указываем имя длл-ки, то сообщения идут тока ей. (прошу не судить за убогость мысли).
Интересно послушать мнение остальных, и решылась ли у них эта проблема.

Всего записей: 258 | Зарегистр. 10-04-2002 | Отправлено: 00:50 28-12-2003
ollv

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
 Спросил, потому как в принципе механизм Hook-ов отличается по требованиям в 98/95 и нт... потому как в 9* не обязательно хуковую ф-цию встраивать в dll можно преподносить ей указатель на ф-цию котрая находится в апликейшине устанавливающем хук,...потому она и сработала при GetModuleHGandle (NULL), очевилно она вернула NULL, а SetWindowsHookEx вставила автоматом HANDLE процесса его вызывающего..  
   В НТ /2000 надо делать обязательно в dll т.е.  
Желательно HANDLE h_dll = LoadLibrary (DllName) ; Потом PROC *proc = GetProcAddress(ProcName, h_dll);  
потом устанавливать Хук, так вроде корректнее..  пишу по памяти дык шо если что сорри.. )) Но смысл тот же..  

Всего записей: 165 | Зарегистр. 25-12-2003 | Отправлено: 12:52 29-12-2003
MAX_DAMAGE



Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Чо то я непонял. Ты ж типа пример привел проги которая хук устанавливает(вернее проги которая вызывает функцию установки хука)? Так я всегда хук так устанавливаю, а как иначе глобальный хук сделать?

Всего записей: 258 | Зарегистр. 10-04-2002 | Отправлено: 17:57 29-12-2003
ollv

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
/*
 а как иначе глобальный хук сделать?
*/
  Суть в том, что если делать Хук под 9*, то возможно в качестве обработчика вставляемого в цепочку вызовов,  устанавливать ф-цию которая находится в аппликейшине и длл вообще не делать, а под НТ такое не проканает. и вообще у тебя вызов SetWindowsHookEx от куда происходит ? В апп-не или в длл-нине? Потому как из приведенного тобой кода я не могу сделать заключение где происходит установка. От этого зависит то как я буду понимать вопрос.. )
  Т.е. из программы а не из dll,  в dll можно приготовить несколько функций и потом уже накладывать ту или иную по необходимости, и на определенный поток в системе можно накладывать это иногда очень полезно (например в тех случаях когда тебе надо инкапсулировать код твоего потока в чужой процесс запустить его, а свой апликатион выгрузить из памяти )
  Вообще я предпочитаю делать так как я описал.
 __hdll = LoadLibrary("PTHRDHDLL.dll");
 if(!__hdll)MessageBox("error !");
    lpProcHook =(__LPPROCHOOK) GetProcAddress(__hdll,"__stHookPR");
    lpProcHookIn = (__LPPROCHOOKIN)GetProcAddress(__hdll,"__WindowsHook");
 
    SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)lpProcHook,__hdll,
                                  __lt->lpThreadEntry->th32ThreadID);
 
просто по твоему коду непонятно все было описано в длл-нине или нет .. ? Вот я и спросил.

Всего записей: 165 | Зарегистр. 25-12-2003 | Отправлено: 19:26 29-12-2003
MAX_DAMAGE



Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Здесь я привел пример DLL
а уже апликейшен вызывает из этой DLL Install и Unistall

Всего записей: 258 | Зарегистр. 10-04-2002 | Отправлено: 22:34 29-12-2003
ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Суть в том, что если делать Хук под 9*, то возможно в качестве обработчика вставляемого в цепочку вызовов,  устанавливать ф-цию которая находится в аппликейшине и длл вообще не делать

Вот тут то и промахнулся  

Цитата:
 
The system hooks are a shared resource, and installing one affects all applications. All system hook functions must be in libraries.
 

Короче если надо мониторить систему, то хук должен быть в либе, а если только свой процесс. то где угодно. Так, что ты не прав. И не важно какая вынь. Однако надо хэлпы полнее читать

----------
И создал Бог женщину... Существо получилось злобное, но забавное...

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 02:13 30-12-2003
MAX_DAMAGE



Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Ну то что локальные хуки в апликатионах делать мона так ето и ежу понятно.

Всего записей: 258 | Зарегистр. 10-04-2002 | Отправлено: 03:27 30-12-2003
ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Ну то что локальные хуки в апликатионах делать мона так ето и ежу понятно.  

А чел утверждал, что в вынь 9х их мона за системные выдавать. Я попытался объяснить, что это не так. Сам то я знаю, что самое место хуку в либе.

----------
И создал Бог женщину... Существо получилось злобное, но забавное...

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 07:30 30-12-2003
ollv

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
/*
 А чел утверждал, что в вынь 9х их мона за системные выдавать. Я попытался объяснить, что это не так. Сам то я знаю, что самое место хуку в либе.
*/
   Господа, )) я прекрасно понимаю, что место хуку в либе, более того он не установится если он не в длл под 2000/НТ, но может стоит попробовать с 9*,. )) Я точно помню, что под 9* работал локальный хук установленный как системный.. не помню по моему на кейбоард )) Это я к тому, что под 9* все немного по другому работает, и следовательно что то говорить заранее тяжело бо нельзя проверить на практике.  
   Дальше SetWindowsHookEx принимал в качестве хандла на модуль - 0,  GetModuleHandle(NULL) , вы проверяли что такой вызов возвращал, в длл в 95-ой.. В 2000 это возвращает ашмодуль текущего модуля.  
 
Добавлено
   Нет приду домой (на работе нет 9*) ну это уже после Н.Г. проверю может, я и че-то напутал .. ))
   Кстати пробовали вызывать в ф-ции которая устанавливается как ловушка     TerminateProcess(GetCurrentProcess(),exCode); ? А потом вызвать то событие, на которое оно накладывается .. ? )

Всего записей: 165 | Зарегистр. 25-12-2003 | Отправлено: 11:07 30-12-2003
Открыть новую тему     Написать ответ в эту тему

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Хуки Windows


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru