Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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)

код в студию.


Наверх

Титульная страница Поиск, карта сайта Написать письмо