
26.04.2011, 14:47
|
 |
Let Me Show You
|
|
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
|
|
простейший пример:
Код:
library Hook;
uses Windows, Messages;
type
PGlobalData = ^TGlobalData;
TGlobalData = record
TargetWnd: HWND;
MessageWnd: Cardinal;
end;
const
FileMappingName: PChar = 'Creates_or_opens_a_named_or_unnamed_file_mapping_object';
var
FileMappingHandle: THandle;
GlobalData: PGlobalData = nil;
hCallWndProc: HHOOK = 0;
function CallWndProc(nCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
begin
if nCode=HC_ACTION then
PostMessage(GlobalData^.TargetWnd, GlobalData^.MessageWnd, wParam, lParam);
Result:=CallNextHookEx(0, nCode, wParam, lParam);
end;
procedure SetHook(ATargetWnd: HWND; AMessageWnd: Cardinal);
begin
GlobalData^.TargetWnd:=ATargetWnd;
GlobalData^.MessageWnd:=AMessageWnd;
hCallWndProc:=SetWindowsHookEx(WH_CALLWNDPROC, @CallWndProc, HInstance, 0);
end;
procedure UnSetHook();
begin
UnhookWindowsHookEx(hCallWndProc);
GlobalData^.MessageWnd:=0;
GlobalData^.TargetWnd:=0;
end;
exports SetHook, UnSetHook;
procedure DLLHandler(Reason: Integer);
begin
case Reason of
DLL_PROCESS_ATTACH: begin
FileMappingHandle:=CreateFileMapping($ffffffff, nil, PAGE_READWRITE, 0, SizeOf(TGlobalData), FileMappingName);
GlobalData:=MapViewOfFile(FileMappingHandle, FILE_MAP_ALL_ACCESS, 0, 0, SizeOf(TGlobalData));
end;
DLL_PROCESS_DETACH: begin
UnmapViewOfFile(GlobalData);
CloseHandle(FileMappingHandle);
end;
end;
end;
begin
DllProc:=@DLLHandler;
DLLHandler(DLL_PROCESS_ATTACH);
end.
из exe вызываешь SetHook(ATargetWnd: HWND; AMessageWnd: Cardinal); для установки хука и UnSetHook(); для снятия.
__________________
Пишу программы за еду.
__________________
|