Newsgroup: it.comp.lang.delphi
Titolo: Hook Lento

Salve a tutto il NG.
Ho fatto un semplice Hook di sistema che 
intercetta il Click del mouse, avvalendomi 
anche di un mapfile per comunicare con 
l'applicazione.
Tutto funziona alla parfezione, se non fosse
che alcuni impulsi vengono persi, dal momento che 
(non capisco come mai) l'hook è relativamente lento.
Provando a rilevare l'evento con il OnMousedown della form
il tutto è perfetto.
Qualcuno mi sa dire perchè?
oppure se esiste un modo per velociare l'intercettazione
del click?
uso Delphi 7.
devono essere rilevati circa 4 click al secondo.
grazie a xchi mi vorrà rispondere.
G.Devil.
 
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 ha scritto nel messaggio 
news:dab9a55e05a6deb69be...@mygate.mailgate.org...

Per caso usa un messaggio in broadcast o "posta" l'evento direttamente 
all'eseguibile tramite il suo handle?
Senza vedere il codice e' difficile darti capirne qualcosa
Giorgio 

 Giorgio
Ciao Giorgio.
Ti posto di seguito il codice che uso:
 La  DLL
 Var
      HookMap : THandle;{Handle al Map_File}
      HookDelTasto : HHook;
      PRicettore : ^Integer;
{$R *.res}
function HookActionCallBack(Code: integer; Msg: WPARAM;
         MouseHook: LPARAM):LRESULT; stdcall;
 
begin
  if (Msg=WM_LBUTTONDOWN)Or(Msg=WM_LBUTTONDBLCLK) Or
     (Msg=WM_RBUTTONDOWN) Or (Msg=WM_MBUTTONDOWN) Or
     (Msg=WM_MOUSEWHEEL) then
  Begin            
     HookMap:=OpenFileMapping(FILE_MAP_READ,False,'Ricettore');
       {Se il MapFile non esiste non mandiamo nulla all'applicazione
ricevente}
     if HookMap <> 0 then
     begin
        PRicettore:=MapViewOfFile(HookMap,FILE_MAP_READ,0,0,0);
        PostMessage(PRicettore^,WM_LBUTTONDOWN,Msg,MouseHook);
        UnmapViewOfFile(PRicettore);
        CloseHandle(HookMap);
     End;
  End;
  Result:=CallNextHookEx(HookDelTasto,Code,Msg,MouseHook);
end;
Function InitializeHook(AWndCallBack:HWnd):HWnd; stdcall; export;
  begin
HookDelTasto:=SetWindowsHookEx(WH_MOUSE,HookActionCallBack,HInstance,0);
end;
procedure FinalizeHook; stdcall; export;
begin
    UnhookWindowsHookEx(HookDelTasto);
end;
exports
  InitializeHook,
  FinalizeHook;
begin
end.
//--------
  Il Caricamento della Libreria
procedure THook_Mouse.Button1Click(Sender: TObject);
Var RecHandle : THandle;
begin
     // Ricavo il Hancle alla applicazione
   RecHandle := FindWindowEx(0,0,PChar(Edit1.Text),PChar(Edit2.Text));
       // Ricavo il fiferimento alla dll 
       HandleDLL:=LoadLibrary(
PChar(ExtractFilePath(Application.Exename)+
                                 NomeDLL));
   if HandleDLL = 0 then
      raise Exception.Create('Impossibile caricare la DLL');
   @InitializeHook :=GetProcAddress(HandleDLL, 'InitializeHook');
   @FinalizeHook:=GetProcAddress(HandleDLL, 'FinalizeHook');
   IF (not assigned(InitializeHook)) or (not assigned(FinalizeHook))
then
      raise Exception.Create('Impossibile trovare le funzioni della Dll
richiesta');
      {Crea il files in memoria}
   FileMap:=CreateFileMapping( $FFFFFFFF, nil,PAGE_READWRITE,0,
                                SizeOf(Integer),'Ricettore');
        {Se il files non è stato creato, errore}
   if FileMap=0 then
     raise Exception.Create( 'Errore durante la creazione del file
mappato in memoria');
      {Punta al files di memoria}
   PRicettore:=MapViewOfFile(FileMap,FILE_MAP_WRITE,0,0,0);
   {Scrivo i dati nel file di memoria}
   PRicettore^:= RecHandle;
   InitializeHook(RecHandle);
end;
// Intercetto il Messaggio
procedure THook_Mouse.ScritturaDelHook(var message: TMessage);
 begin
   Case Message.wParam Of
      WM_LBUTTONDOWN : Azione1;
      WM_LBUTTONDBLCLK : Azione2;
      WM_RBUTTONDOWN : Azione3;
      WM_MBUTTONDOWN : Azione4;
      WM_MOUSEWHEEL : Azione5;
   End;
 end;
Graie per avermi risposto
 ciao G.Devil.


 Ti posto di seguito il codice che uso:
Ho visto che riapri e chiudi il filemap ad ogni evento catturato.
Prova ad aprirlo e chiuderlo solo rispettivamente all'InitializeHook e al 
FinalizeHook.
Ciao Giorgio 

 Ciao


 Anche con questa variaione non cambia assolutamente nulla.
Anziché usare il memory mapped file, registra un messaggio di Windows
(RegisterWindowMessage) ed utilizza quello per comunicare tra DLL "hooked"
e applicazione...
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

> Ciao
Tutto il codice della  HookActionCallBack (vedi l'help) va' inserito 
all'interno di un :
Function HookActionCallBack(..)
begin
if Code=HC_ACTION Then
   begin
...
    end;
Result:=CallNextHookEx(GlobalDataMouse^.hHookMouse, Code, wParam, lParam);
end;
Ciao Giorgio

 e applicazione...
Purtroppo Anche con questo sistema non cambia nulla.
Grazie per la risposta.
 G.Devil.


 Purtroppo Anche con questo sistema non cambia nulla.
Le callback degli hook devono seguire una logica precisa.  In particolare,
devi testare che il parametro nCode sia < 0.  In questo caso, infatti,
devi saltare direttamente a CallNextHookEx e restituire il suo valore al
sistema.


 sistema.
 Sei più veloce dell'hook :)
 
  Purtroppo è esattamente come prima. 


 ha scritto nel messaggio 
news:75633f1c8b6b70abda7...@mygate.mailgate.org...

Quando i click sono ravvicinati, diventa un doppio click, forse tu ti 
aspetti 2 WM_LBUTTONDOWN, ma non e' cosi' il secondo click produce un 
WM_LBUTTONDBLCLK che tu ignori "perdendo colpi".
Ciao Giorgio 

 Ciao G.Devil


 ha scritto nel messaggio 
news:93e585aac91c27660c6...@mygate.mailgate.org...

Come fai ad essere sicuro che non caschi qualche doppio click?
Giorgio 

 G.Devil.


 ha scritto nel messaggio 
news:dcc5d81c0627881ac7a...@mygate.mailgate.org...

Se i click sono vicini anche col tasto centrale hai i doppi click il cui 
messaggio del secondo click (in down) e' WM_MBUTTONDBLCLK che tu non rilevi.
Giorgio 

 
Sarebbe certo cosi' se non fosse che con il OnMouseDown del form
il tutto funziona.


 ha scritto nel messaggio 
news:e5603eff62b95ac1d38...@mygate.mailgate.org...

Certo perche' Delphi interpreta il WM_MBUTTONDBLCLK come un OnMouseDown. 
Almeno hai provato a fare la modifica nel codice intercettando il msg. 
citato.
Giorgio
 

 Giorgio


 ah.. Certo avevo gia' provato, ma non cambia.
Ho passato tutta la sera a fare prove, poi mi sono accorto che 
effettivamente avevo provato a gestire il doppio click ma del 
tasto sbagliato, ho fatto la correzione del caso e in effetti 
funziona.
 Grazie Giorgio, se tu non avessi insistito sulla tua tesi, avrei 
dovuto cambiare sistema, sei stato risolutivo.
 
Ciao G.Devil.


 ah.. Certo avevo gia' provato, ma non cambia.
 
 Ho passato tutta la sera a cercare la soluzione e, 
mi sono accorto che avevo si, gestito il doppio click,
ma del tasto sbagliato, ho fatto la correzione del caso
ed ora funge alla perfezione.
Grazie alla tua puntuale insistenza, sei stato risolutivo.
Grazie G.Devil. 
