![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Hook
gary © (2006-12-14 16:28:00)Поставил локальный hook на wm_rbuttondown для форми, и аннулировал это сообщение,
но компонент webbrowser при ссылке на html документ делает ошибку типа: слишком много последовательные исключения, как избавится от этои ошибки
gary (2006-12-16 15:49:00) [1]procedure OpenGlobalData();
для передач данних остальним хукам на тот же сообщение
gary (2006-12-16 15:30:00) [2]заменa
MessageBox(0, 'HOOK1 onoaiiaeou ia oaaeinu !', 'Message
from Process1', 0);
на
Result := 1;
Exit;
к сожалению не помогает, может система не терпит что та
к сожалению не помогает, может система не терпит что та
MetalFan (2006-12-15 19:26:00) [3]
> procedure OpenGlobalData();
> begin
> SizeOf(TGlobalDLLData), MMFName); ЧЕЭТО????
> MMFHandle:= CreateFileMapping(INVALID_HANDLE_VALUE, nil,
> PAGE_READWRITE, 0, SizeOf(TGlobalDLLData), MMFName);
Eraser (2006-12-15 18:54:00) [4]> [2] gary (15.12.06 17:41)
попробуй заменить
> MessageBox(0, 'HOOK1 onoaiiaeou ia oaaeinu !', 'Message
> from Process1', 0);
на
Result := 1;
Exit;
> uses
> Windows,
> Messages,
> Forms,
> ShDocVw,
> controls,
> Unit1 in 'Unit1.pas' {Form1};
поудаляй лишнее из dll, здесь оно абсолютно не к чему.
gary (2006-12-15 17:41:00) [5]library hook_dll1;
uses
Windows,
Messages,
Forms,
ShDocVw,
controls,
Unit1 in 'Unit1.pas' {Form1};
const
MMFName: PChar = 'MyMMF';
type
PGlobalDLLData = ^TGlobalDLLData;
TGlobalDLLData = packed record
SysHook: HWND;
end;
var
GlobalData: PGlobalDLLData;
MMFHandle: THandle;
function SysMsgProc(code : integer; wParam : word; lParam : longint) : longint; stdcall;
begin
if code = HC_ACTION then
begin
if TMsg(Pointer(lParam)^).message = WM_RBUTTONDOWN then
begin
MessageBox( 0, 'Ther is no any context!', 'Message from HookDll', 0 );
TMsg(Pointer(lParam)^).message := WM_NULL;
end;
end;
Result:= CallNextHookEx(GlobalData^.SysHook, Code, wParam, lParam);
end;
procedure hook(switch : Boolean) export; stdcall;
begin
if switch=true then
begin
GlobalData^.SysHook := SetWindowsHookEx(WH_GETMESSAGE, @SysMsgProc, HInstance,
GetWindowThreadProcessId(FindWindow('TForm1', 'Form1'), nil ));
if GlobalData^.SysHook 0 then
MessageBox(0, 'HOOK1 óñòàíîâëåí !', 'Message from Process1', 0)
else
MessageBox(0, 'HOOK1 óñòàíîâèòü íå óäàëîñü !', 'Message from Process1', 0);
end
else
begin
if UnhookWindowsHookEx(GlobalData^.SysHook) then
MessageBox(0, 'HOOK1 ñíÿò !', 'Message from Process1', 0)
else
MessageBox(0, 'HOOK1 ñíÿòü íå óäàëîñü !', 'Message from Process1', 0);
end;
end;
procedure OpenGlobalData();
begin
SizeOf(TGlobalDLLData), MMFName);
MMFHandle:= CreateFileMapping(INVALID_HANDLE_VALUE, nil, PAGE_READWRITE, 0, SizeOf(TGlobalDLLData), MMFName);
if MMFHandle = 0 then
MessageBox(0, 'Can''t create FileMapping', 'Message from Process1', 0);
GlobalData:= MapViewOfFile(MMFHandle, FILE_MAP_ALL_ACCESS, 0, 0, SizeOf(TGlobalDLLData));
if GlobalData = nil then
begin
CloseHandle(MMFHandle);
MessageBox(0, 'Can''t make MapViewOfFile', 'Message from Process1', 0);
end;
end;
procedure CloseGlobalData();
begin
UnmapViewOfFile(GlobalData);
CloseHandle(MMFHandle);
end;
procedure DLLEntryPoint(dwReason: DWord); stdcall;
begin
case dwReason of
DLL_PROCESS_ATTACH: OpenGlobalData;
DLL_PROCESS_DETACH: CloseGlobalData;
end;
end;
exports hook;
begin
DLLProc:= @DLLEntryPoint;
DLLEntryPoint(DLL_PROCESS_ATTACH);
end.
/////////////////////////////////////////////////////////////////////////////////////
от туда вызывается этот dll
type
MyProcType = procedure (flag : Boolean); stdcall;
procedure TForm1.Button1Click(Sender: TObject);
var
hook: MyProcType;
begin
@hook:= nil;
Hdll:= LoadLibrary(PChar('hook_dll1.dll'));
if Hdll > HINSTANCE_ERROR then
begin
@hook:=GetProcAddress(Hdll, 'hook');
Button2.Enabled:=True;
Button1.Enabled:=False;
hook(true);
end
else
ShowMessage('Îøèáêà ïðè çàãðóçêå DLL !');
end;
procedure TForm1.Button2Click(Sender: TObject);
var
hook: MyProcType;
begin
@hook:= nil;
if Hdll > HINSTANCE_ERROR then
begin
@hook:=GetProcAddress(Hdll, 'hook');
Button1.Enabled:=True;
Button2.Enabled:=False;
hook(false);
end;
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
FreeLibrary(Hdll);
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
WebBrowser1.Navigate('d:\untitled1.html');
end;
Eraser (2006-12-14 16:31:00) [6]> [0] gary (14.12.06 16:28)
код в студию.