Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.06.17;
Скачать: CL | DM;

Вниз

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

 
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;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.013 c
6-55251
Zak
2002-04-02 08:20
2002.06.17
Правая мышь на WEBNavigator-е!


1-55091
Serg2002
2002-06-06 08:47
2002.06.17
И снова о масштабах (пиксел*мм) при печати из Image


3-55006
button
2002-05-23 15:11
2002.06.17
State = Edit и Сортировка


14-55270
vopros
2002-05-14 13:53
2002.06.17
Очень сильно хочу спать.


6-55250
Romanew
2002-04-09 12:53
2002.06.17
Как из программы открыть Explorer с заданным файлом