Хуки. Локальные и глобальные.
Модератор: Модераторы
-
MysticCoder
- постоялец
- Сообщения: 154
- Зарегистрирован: 14.09.2013 00:20:28
Запускай от админа и будет тебе счастье. Или как товарищ предлагал выше UAC отключи. Не знаю правда где и как) Вроде ведь пришли к выводу, что из за прав. Ну или скомпиль это дело все под дельфой. Не знаю в чем дело, но под ней у меня по крайней мере не зависали приложения. Может хуки просто не устанавливались по тихому, но не зависали. а ставить хуки надо по первому варианту.
По поводу как оно работает почитай в мсдн, там вроде на уровне драйвера система вызывает ловушку как надо. Так шо по идее длл не обязательна.
Журнальный хук все таки изучи. длл там не надо, а значит не будет плясок с зависаниями как сейчас. главное правильно разобрать данные и сразу перевести нужные сообщения в локализованные символы.
По поводу как оно работает почитай в мсдн, там вроде на уровне драйвера система вызывает ловушку как надо. Так шо по идее длл не обязательна.
Журнальный хук все таки изучи. длл там не надо, а значит не будет плясок с зависаниями как сейчас. главное правильно разобрать данные и сразу перевести нужные сообщения в локализованные символы.
https://github.com/MahdiSafsafi/delphi-detours-library - а ещё можно вот такую штуку использовать, ловит всё. Таким макаром, я даже DirectX хукал.
-
Leonius_Bad
- новенький
- Сообщения: 51
- Зарегистрирован: 29.11.2012 19:18:07
MysticCoder писал(а):Запускай от админа и будет тебе счастье.
Нету счастья..к несчастью..=)
Что от админа, что нет.
Делал по феншую (на сайте мелкософта так написано же! Ну..):
два комплекта, 32 битный и 64 битный. Библиотеки называются по-разному. Даже процедуры на всякий случай назвал по-разному, несложно.
Добавил взятие дескриптора для КаллНекст (ибо, а вдруг таки нужно?). Каждый комплект пишет в свой файл и потом берет дескриптор именно своей хуки (проверил).
И ничего... На мелкософтном сайте было что-то про порядок установки хук. Но тут всего два варианта и никакой разницы порядок запуска не несёт.
При обоих поставленных хуках зависает вообще всё: и 32 битные софтинки и 64 битные..
Поднадоело пока что. Начинаю пробовать иные варианты. Если кто-то данную проблему с WH_KEYBOARD одолеет - дайте, пожалуйста знать, мне дико любопытно... Как же оно всё же должно работать, если вообще должно...
MysticCoder писал(а):Ну или скомпиль это дело все под дельфой.
Не люблю дельфю..С вуза не люблю) Но попробовать- попробую, под какой версией лучше?
Журнальные хуки и ЛоуЛевел изучу и отпишусь сюда же. Спасибо Вам за помощь и терпение. Я еще вернусь
CynicRus писал(а):https://github.com/MahdiSafsafi/delphi-detours-library - а ещё можно вот такую штуку использовать, ловит всё. Таким макаром, я даже DirectX хукал.
О...выглядит любопытно. Спасибо! И это поковыряю)
Ну хук на клавиатуру и мышь, когда мне надо было - я делал вот так: https://github.com/CynicRus/SMR/blob/master/smr_win_hook.pas и всё работает как часы, без каких либо DLL.
-
Leonius_Bad
- новенький
- Сообщения: 51
- Зарегистрирован: 29.11.2012 19:18:07
CynicRus писал(а):Ну хук на клавиатуру и мышь, когда мне надо было - я делал вот так
Благодарю, довольно подробный пример!
Пока нет времени проверить все эти альтернативные варианты, но уже скоро)
Как бы там не было, мне всё равно очень любопытно знать, как же оно должно работать с обычным WH_KEYBOARD в 64 битных осях? Ведь должно же.. Или не должно?
Можно просто обвинить винду в кривизне и успокоится
Leonius_Bad писал(а):Как бы там не было, мне всё равно очень любопытно знать, как же оно должно работать с обычным WH_KEYBOARD в 64 битных осях? Ведь должно же.. Или не должно?
Ну - приведённый мной выше код работает и на x64 и на x32 платформах:)
-
Leonius_Bad
- новенький
- Сообщения: 51
- Зарегистрирован: 29.11.2012 19:18:07
CynicRus писал(а):Ну - приведённый мной выше код работает и на x64 и на x32 платформах:)
Вы используете WH_<>_LL, которое без dll работает.
Кстати, это, как я понял, только модуль с методами\функциями, да? В самом приложении у Вас что? Предполагаю, что цикл приема сообщений (message loop) c TranslateMessage и DispatchMessage, как тут упоминалось ранее.
-
Leonius_Bad
- новенький
- Сообщения: 51
- Зарегистрирован: 29.11.2012 19:18:07
Пока что доволен WH_KEYBOARD_LL. Всё оказалось значительно проще и работает везде (по крайней мере - пока).
Сделал как и писалось выше (приложение консольное):
Сделал как и писалось выше (приложение консольное):
Код: Выделить всё
//Установка хука
KeyHook:=SetWindowsHookEx(13, @KeyBoardHook, Integer(HInstance), 0);
//KeyBoardHook -функция-фильтр, находится прямо в коде программы
//Message loop
while true do
begin
if GetMessage(Msg, 0 , 0, 0) then //Если делать PeekMessage - заметно грузит проц
begin
TranslateMessage(Msg);
DispatchMessage(Msg);
end;
end;
Делаю из примера
Но получаю ошибку
Смотрю объявление - там ровно 4 параметра принимается.
В чем может быть проблема?
Код: Выделить всё
kHook := SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, hInstance, 0); Но получаю ошибку
Error: Wrong number of parameters specified for call to "LowLevelKeyboardProc"
Смотрю объявление - там ровно 4 параметра принимается.
В чем может быть проблема?
Код: Выделить всё
@LowLevelKeyboardProcНу или
Код: Выделить всё
{$ifdef fpc}
{$mode delphi}
{$endif}вместо {$mode objfpc}.
