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

Ciao a tutti,
come si usa l'API SetWindowsHookEx in Delphi?
io ho provato cosě:
 hHook := SetWindowsHookEx(WH_KEYBOARD, @KeyboardFilter, NULL, 0)
- compila ma da errore (a runtime) di conversione variant, mettendo
nil al posto di NULL, lo vede come un puntatore...
- per passare l'indirizzo di una funzione e' giusto usare @Funzione?
- se volessi usare una funzione in una DLL (per hook di sistema), come
posso sapere l'handle della DLL per passarlo alla funzione?
Grazie,
Alan Solo

posso sapere l'handle della DLL per passarlo alla funzione?
cosě potrebbe andare?
// *** DLL ***
 function KeyboardFilter(code: integer; wparam:WPARAM; lparam:
LPARAM): LRESULT;
 begin
  if wparam=VK_F1 then showmessage('F1')
 end;
 function GetHinstance: LRESULT;
 begin
  result := HInstance
 end;
exports
 KeyboardFilter,
 GetHinstance;
....
//*** MAIN ***
 hHook := SetWindowsHookEx( WH_KEYBOARD, @KeyboardFilter,
GetHinstance, GetCurrentThreadId )
pero' non funziona! Dove sbaglio?
Grazie,
Alan Solo

 posso sapere l'handle della DLL per passarlo alla funzione?
hInstance indica l'istanza della DLL.
Ciao! :)
--
- Carlo -
c.b...@libero.it

 GetHinstance, GetCurrentThreadId )
Aldilà del fatto che non vedo la procedura di rimozione
(UnHookWindowsHookEx) ti segnalo che c'è un errore nell'ultimo parametro.
Questo può avere il valore 0 (e indica un hook system-wide) o un Thread Id
riferito ad un thread esterno alla tua applicazione, impostando
GetCurrentThreadId rendi l'hook attivo solo nel tuo spazio di
indirizzamento, facendo così un Hook Locale alla tua applicazione ma
utilizzando una DLL (inutile in questo caso)
Ecco il prototipo corretto:
-- DLL --
library Hooklib;
uses
  Windows,
  Dialogs;
Var
 HookHandle: Integer;
Procedure KeyboardHook(Codice:Integer; Tasto:Wparam; Stato:Lparam); Stdcall;
Begin
 If (Codice=HC_Action) and (Tasto=VK_F1) then
 ShowMessage('F1 premuto');
 Result:=CallNextHookEx(HookHandle,Codice,Tasto,Stato);
end;
Procedure CaricaHook; stdcall;
Begin
   HookHandle:=SetWindowsHookEx(WH_Keyboard,@KeyboardHook,hInstance,0);
end;
Procedure RimuoviHook; stdcall;
Begin
   UnHookWindowsHookEx(HookHandle);
end;
Exports
CaricaHook,RimuoviHook;
end.
--DLL--
--EXE--
Procedure CaricaHook; stdcall; External 'Hooklib.DLL';
Procedure RimuoviHook; stdcall; External 'Hooklib.DLL';
Var ..
procedure TForm1.Button1Click(Sender: TObject);
begin
CaricaHook;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
RimuoviHook;
end;
--EXE--


 HookHandle: Integer;
mi permetto di aggiungere
HookHandle: HHOOK;    // ;)
Ciao, :)
Alan Solo

 HookHandle: HHOOK;    // ;)
Si, hai ragione in quanto i due tipi hHook e Integer non sono neppure
analoghi (hHook = THandle) ... ;)
infatti:
var a: hHook;
    b: Integer;
    c: Thandle;
begin
  ShowMessage(IntToStr(low(a)) + ' ' + IntToStr(High(a)));
  ShowMessage(IntToStr(low(b)) + ' ' + IntToStr(High(b)));
  ShowMessage(IntToStr(low(c)) + ' ' + IntToStr(High(c)));
end;
Ciao ;)


 ha scritto nel messaggio
news:Iof0OofHyNSFV=i4KOHFINqf6=I...@4ax.com...


infatti:
[...]
già ;)
trattasi sempre di 32 bit, pero' integer è signed mentre THandle (e
Hqualcosa) sono unsigned... infatti non avrebbe senso parlare di
handle negativi ;))
Ciao,
Alan Solo

sai darmi indicazioni?
neanche io ho trovato di molto meglio, un hook di Shell
SetWindowsHookEx(WH_SHELL, @ShellHook, hInstance, 0);
scatta alla creazione della main window di un processo,
resta il fatto che non tutti i processi hanno finetre 8)
cmq, sempre meglio dell'esempio che ti o proposto all'inizio (quello
del registro ;)
ora non ho tempo, magari ti faccio sapere se trovo qualcosa...
Ciao,
Alan Solo

sai darmi indicazioni?
Credo che neanche un hook CBT riesca a rilevare il lancio di un
programma.  Semplicemente perche' non credo ci sia nulla a cui
"agganciarsi" per farlo.  Non e' semplice.  Credo che l'unica
soluzione sia scorrere la lista dei processi a istanti separati da
brevi intervalli (con un timer, magari).  Molto molto brutto, a mio
avviso, pero' ho provato e funziona.

 ha scritto nel messaggio
news:3af70ced...@news.libero.it...


*** Ultim'ora ***
Usando WH_SHELL come Hook e HSHELL_WINDOWCREATED come messaggio riesco ad
intercettare l'esecuzione dei programmi windowed.
Come si fa a trovare il nome del programma partendo dal WindowHandle fornito
da W98?
Grazie a tutti.