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

Вниз

Связь хука с создавшей его программой   Найти похожие ветки 

 
Karburator   (2003-07-20 00:03) [0]

Как в процедуре хука обращаться к переменным и классам создавшей его программы при её неактивном состоянии?

Мой код на всяк случай:
var
GlobalPerem: integer = 0;
SysHook: HHook = 0;
Form1: TForm1;

implementation
{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
SysHook := SetWindowsHookEx(WH_GETMESSAGE, @SysMsgProc, HInstance, 0);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
UnhookWindowsHookEx(SysHook);
SysHook := 0;
end;

function SysMsgProc(code: integer; wParam: word; lParam: longint): longint; stdcall;
begin
CallNextHookEx(SysHook, Code, wParam, lParam);
if code = HC_ACTION then
begin
if TMsg(Pointer(lParam)^).message = WM_LBUTTONDOWN then
begin
// inc(GlobalPerem); - надо использовать глобальную переменную
( GlobalPerem) Как в процедуре хука обращаться к переменным и классам создавшей его программы при её неактивном состоянии?

Мой код на всяк случай:
var
GlobalPerem: integer = 0;
SysHook: HHook = 0;
Form1: TForm1;

implementation
{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
SysHook := SetWindowsHookEx(WH_GETMESSAGE, @SysMsgProc, HInstance, 0);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
UnhookWindowsHookEx(SysHook);
SysHook := 0;
end;

function SysMsgProc(code: integer; wParam: word; lParam: longint): longint; stdcall;
begin
CallNextHookEx(SysHook, Code, wParam, lParam);
if code = HC_ACTION then
begin
if TMsg(Pointer(lParam)^).message = WM_LBUTTONDOWN then
begin
// inc(GlobalPerem); - надо использовать глобальную переменную
// Form1.caption:=inttostr(GlobalPerem); - надо обратится к объекту находящемуся в программе, создавшей хук
beep();
end;
end;
end;


 
Spawn ©   (2003-07-20 06:43) [1]

Смотри CreateFileMapping+MapViewOfFile


 
Karburator   (2003-07-21 01:14) [2]

Смотрю... А как их прменять? :)


 
m_a_r_t ©   (2003-07-21 01:38) [3]

Вот исходник моего хука, может тебе поможет:

{
KeyHook
author: M_A_R_T
e-mail: m_a_r_t@mail.ru
http://home-mart.by.ru/

XProject
http://www.team-x.ru/
}

library khook;

uses
windows,
messages;

type
PHookRec = ^THookRec;
THookRec = record
MainWindow: HWND;
HookID: HHOOK;
MsgToSend: Integer;
end;

var
rHookRec: PHookRec;
FMHandle: THandle;

function KeybHook(Code: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
var
AppWnd: HWND;
begin
if code=HC_ACTION then
AppWnd:=GetForegroundWindow();
if ((lParam shr 31) and 1)=1 then
SendMessage(rHookRec^.MainWindow,rHookRec^.MsgToSend,wParam,AppWnd)
else
SendMessage(rHookRec^.MainWindow,rHookRec^.MsgToSend+1,wParam,AppWnd);
Result := CallNextHookEx(rHookRec^.HookID,Code,wParam,lParam)
end;

procedure SetMainHandle(Handle: HWND);
begin
rHookRec^.MainWindow:= Handle;
end;

procedure SetMsgToSend(Msg: Integer);
begin
rHookRec^.MsgToSend:= Msg;
end;

procedure StartHook; stdcall;
begin
if rHookRec^.HookID=0 then
rHookRec^.HookID :=SetWindowsHookEx(WH_KEYBOARD,@KeybHook,HInstance,0);
end;

procedure StopHook; stdcall;
begin
if rHookRec^.HookID<>0 then
begin
UnhookWindowsHookEx(rHookRec^.HookID);
rHookRec^.HookID:=0;
end;
end;

procedure EntryPointProc(Reason: Integer);
begin
case reason of
DLL_PROCESS_ATTACH:
begin
FMHandle:= CreateFileMapping(INVALID_HANDLE_VALUE, nil, PAGE_READWRITE, 0, SizeOf(THookRec), "khookFM");
rHookRec:= MapViewOfFile(FMHandle, FILE_MAP_ALL_ACCESS, 0, 0, SizeOf(THookRec));
end;

DLL_PROCESS_DETACH:
begin
try
UnmapViewOfFile(rHookRec);
CloseHandle(FMHandle);
except
end;
end;
end;
end;



exports
SetMainHandle,
SetMsgToSend,
StartHook,
StopHook;

begin
DllProc := @EntryPointProc;
( DLL_PROCESS_ATTACH) Вот исходник моего хука, может тебе поможет:

{
KeyHook
author: M_A_R_T
e-mail: m_a_r_t@mail.ru
http://home-mart.by.ru/

XProject
http://www.team-x.ru/
}

library khook;

uses
windows,
messages;

type
PHookRec = ^THookRec;
THookRec = record
MainWindow: HWND;
HookID: HHOOK;
MsgToSend: Integer;
end;

var
rHookRec: PHookRec;
FMHandle: THandle;

function KeybHook(Code: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
var
AppWnd: HWND;
begin
if code=HC_ACTION then
AppWnd:=GetForegroundWindow();
if ((lParam shr 31) and 1)=1 then
SendMessage(rHookRec^.MainWindow,rHookRec^.MsgToSend,wParam,AppWnd)
else
SendMessage(rHookRec^.MainWindow,rHookRec^.MsgToSend+1,wParam,AppWnd);
Result := CallNextHookEx(rHookRec^.HookID,Code,wParam,lParam)
end;

procedure SetMainHandle(Handle: HWND);
begin
rHookRec^.MainWindow:= Handle;
end;

procedure SetMsgToSend(Msg: Integer);
begin
rHookRec^.MsgToSend:= Msg;
end;

procedure StartHook; stdcall;
begin
if rHookRec^.HookID=0 then
rHookRec^.HookID :=SetWindowsHookEx(WH_KEYBOARD,@KeybHook,HInstance,0);
end;

procedure StopHook; stdcall;
begin
if rHookRec^.HookID<>0 then
begin
UnhookWindowsHookEx(rHookRec^.HookID);
rHookRec^.HookID:=0;
end;
end;

procedure EntryPointProc(Reason: Integer);
begin
case reason of
DLL_PROCESS_ATTACH:
begin
FMHandle:= CreateFileMapping(INVALID_HANDLE_VALUE, nil, PAGE_READWRITE, 0, SizeOf(THookRec), "khookFM");
rHookRec:= MapViewOfFile(FMHandle, FILE_MAP_ALL_ACCESS, 0, 0, SizeOf(THookRec));
end;

DLL_PROCESS_DETACH:
begin
try
UnmapViewOfFile(rHookRec);
CloseHandle(FMHandle);
except
end;
end;
end;
end;



exports
SetMainHandle,
SetMsgToSend,
StartHook,
StopHook;

begin
DllProc := @EntryPointProc;
EntryPointProc(DLL_PROCESS_ATTACH);
end.



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

Текущий архив: 2003.09.22;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.022 c
14-71895
Developerr
2003-09-02 18:37
2003.09.22
Кто-нибудь использует F1Book версии 6.0 и выше?


14-71910
Nik8.
2003-09-03 11:25
2003.09.22
Глюк Tdbgrid-a


3-71515
Don Korleone
2003-09-01 04:55
2003.09.22
BDE, IBX, TTable


14-71825
jack128
2003-09-02 10:38
2003.09.22
Именинники 2 сентября


1-71607
lex7
2003-09-09 16:52
2003.09.22
программа для создания демонстрашек в виде avi