Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 2002.06.17;
Скачать: [xml.tar.bz2];

Вниз

К теме об обучении: Люди, расскажите, как хуки делаются?   Найти похожие ветки 

 
lipskiy   (2002-05-15 01:01) [0]

Имею только поверхностное представление - то есть, никакое.
Мне не нужно что-то конкретное, мне нужно просто понять.
Как вешаются, какая система их работы (сообщения?).
Если можно - на примере (любом).
Спасибо.


 
Alx2   (2002-05-15 07:45) [1]

Если хуки глобальные - то реализация перехватывающей функции должна быть в DLL (потому-что windows может внедрить DLL в адресное пространство чужого процесса). Если хуки только на свой процесс - то реализация перехватывающей процедуры может сидеть и в собственном exe-файле.

Вот пример DLL, которая содержит хук WH_CBT (Windows calls a WH_CBT hook procedure before activating, creating, destroying, minimizing, maximizing, moving, or sizing a window; before completing a system command; before removing a mouse or keyboard event from the system message queue; before setting the input focus; or before synchronizing with the system message queue. The value the hook procedure returns determines whether Windows allows or prevents one of these operations. The WH_CBT hook is intended primarily for computer-based training (CBT) applications. )


Library LogDll;
Uses
sharemem, // - Классика при работе со строками
Windows,
SysUtils,
Messages;

Const hhk: HHOOK = 0;
{$R *.RES}
Type
TCallBackProc = Procedure (nCode: Integer; WPARAM, LPARAM: Integer) Of Object; Stdcall;
Var
CallBackProc: TCallBackProc;
MyWindow : HWND;

Procedure SetCallBackProc(aProc: TCallBackProc); Stdcall;
Begin
CallBackProc := aProc;
End;
// Здесь обрабатываем перехват:
Function ShellProc(nCode: Integer; WPARAM, LPARAM: Integer): Integer; Stdcall;
Var
CBTCreateWnd: PCBTCreateWnd Absolute LPARAM; // Структура, адрес которой Windows передает в LParam. Для других типов хуков может Lparam может иметь другое назначение.
Str : String;
DataStruct : TCOPYDATASTRUCT; // Структура для отправки информационного сообщения другому окну (в нашем случае - "родному" процессу. Напрямую это сделать нельзя, так как мы можем находиться в адресном пространстве другого процесса и нужный нам "родной" процесс уже для нас чужой. Поэтому общаемся с ним либо через сообщения, либо через MMF

Begin
Result := CallNextHookEx(hhk, nCode, WPARAM, LPARAM); // Вот это у меня не правильно, потому-что hhk должно сидеть в разделяемой памяти, а здесь сидит локально. То есть имеем потенциальный глюк!
If (nCode = hcbt_ACTIVATE) // Если пришедший код означает, что какое-то окно стало активным то...
Then
Begin
// Ищем "родину":
MyWindow := FindWindow("TWatcherForm", "WatcherForm");
SetLength(Str,255);
GetClassName(wParam,PChar(Str),255); // Узнаем класс окна, ставшего активным
Str := PChar(Str);
with DataStruct do // Заполняем "посылку"
begin
dwData := wParam;
cbData := Length(Str)+4;
lpData := Pointer(Str);
end;
SendMessage(MyWindow, WM_CopyData, 8101973, Integer(@DataStruct)); // Шлем на "родину" весточку
End;
End;

Function SetHook(AInstance: LongWord): HHOOK; Stdcall;
// Отсюда выставляем хук. Параметр AInstance - для моих внутренних целей. Он не существенен :)
Begin
If (AInstance = LongWord( - 1)) Then
AInstance := HInstance;
hhk := SetWindowsHookEx(WH_CBT,
@ShellProc,
AInstance, // Передаем описатель DLL
0 // 0 - значит хук глобальный, если здесь поставить GetCurrentThreadID, то хук будет только для нашего потока (в котором выполняется DLL)

);
Result := hhk;
End;

Procedure UnHook; Stdcall;
Begin
UnhookWindowsHookEx(hhk);
hhk := 0;
End;

Function GetHook: HHOOK; Stdcall;
Begin
Result := hhk;
End;

Exports
SetHook, UnHook, GetHook, SetCallBackProc, ShellProc;
Begin
hhk := 0;
CallBackProc := Nil;
MyWindow := 0;
End.


Как и требовалось - пример "любой". В данном случае переменную hhk надо селить в MMF


 
Alx2   (2002-05-15 07:49) [2]

Еще существенно: в данном примере имеет смысл рассматривать только Function ShellProc(nCode: Integer; WPARAM, LPARAM: Integer): Integer; Stdcall, так как почти все остальное - забыл вычистить и служит оно для других целей.


 
lipskiy   (2002-05-15 12:51) [3]

Ок, спасибо!
Понял мало что, но приду домой - поразбираюсь и поспрашиваю еще.
А зачем могут быть практически нужны хуки в своем процессе?


 
IronHawk   (2002-05-15 12:58) [4]

"ХУК" - невидымый, отлавливатель и фиксатор, событий ОС !


 
VictorT   (2002-05-15 13:14) [5]

http://www.rsdn.ru/article/?baseserv/winhooks.xml
http://www.rsdn.ru/article/?baseserv/hookdll.xml


 
lipskiy   (2002-05-15 21:34) [6]

2 VictorT
ВАУ!!!
Вот за это - отдельное спасибо! (И че сам поискать поленился...)



Страницы: 1 вся ветка

Форум: "Потрепаться";
Текущий архив: 2002.06.17;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.007 c
14-55297
Igorek
2002-05-03 00:42
2002.06.17
Кто как решает алгоритмические трудности?


1-55142
nea
2002-06-04 11:57
2002.06.17
Просмотр безразмерного текстового файла


3-55013
Wreck
2002-05-23 19:22
2002.06.17
КАК писать скрипты???????????


1-55061
cult
2002-06-05 17:47
2002.06.17
прорисовщик компонента


1-55161
ЗЛ
2002-06-04 14:50
2002.06.17
Есть StringGrid и у меня в зависимости от того какая команда в яч





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский