Форум: "Потрепаться";
Текущий архив: 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