Newsgroup: it.comp.lang.delphi
Titolo: Intercettare i messaggi di Windows

Salve, come posso fare per intercettare i messaggi di Windows relativi
all'apertura e alla chiusura di una MessageBox?
Grazie in anticipo.
Alessandro

 all'apertura e alla chiusura di una MessageBox?
Vado a memoria; ci dovrebbe essere un hook che Windows invoca prima della
creazione di ogni finestra. Credo sia il CBT.
--
- Carlo -

> Credo sia il CBT.
Hai detto bene Carlo!
http://17slon.com/gp/gp/gpsyshook.htm
A questo indirizzo si trova tutto ciò che serve. Vi è una DLL + sorgenti
Delphi +  Documentazione.
--
Acqua
-------------------------------------------------------
Download new version of my PixExperts for Delphi 6/C++ Builder 6 at
http://www.salexander.supereva.it/Pix_Exp171D6.zip

all'apertura e alla chiusura di una MessageBox?
Se ti interessa farlo per tutte le messagebox, a qualunque
applicazione appartengano, puoi ricorrere agli "hook":
http://tinyurl.com/out2

 
http://tinyurl.com/out2
Mi interessa farlo soltanto per la mia applicazione.

 Delphi +  Documentazione.
Ho scaricato il file, però non ho capito come usarlo.
Con questa DLL è possibile intercettare soltanto l'apertuta e la
chiusura delle MessageBox della mia applicazione? Inoltre non avendo
mai usato gli Hook, nostante abbia consultato l'Help di Win32, non so'
come si usano.

 come si usano.
E' più semplice di quanto tu possa pensare....
Gli hooks vengono usati per controllare le occorrenze e la gestione degli
eventi di sistema.
Un hook di Windows è definibile mediante la funzione API SetWindowsHookEx:
function SetWindowsHookEx(idHook: Integer; lpfn: TFNHookProc; hmod: HINST;
dwThreadId: DWORD): HHOOK; stdcall;
Il parametro idHook descrive il tipo di hook al quale vuoi fare riferimento
(consulta la guida per i vari valori).
Nel tuo caso ti serve il  wh_CBT.
Il parametro lpfn è l'indirizzo della funzione callback che verrà richiamata
al verificarsi dell'evento in questione.
Questa funzione è di tipo TFNHookProc, definita come segue:
TFNHookProc = function (code: Integer; wparam: WPARAM; lparam: LPARAM):
LRESULT stdcall;
Il contenuto dei parametri di questa funzione, varia a seconda del tipo
di hook che si sta usando. Consulta la guida dell'API di win32 per i
dettagli.
hMod rappresenta il valore di hInstance dell'applicazione o della DLL
contenente
la chiamata di ritorno dell'hook.
Il parametro dwThreadID identifica il thread con il quale è associato l'hook
e, se è
zero, l'hook stesso sarà associato a tutti i thread.
Il valore di ritorno è un gestore di hooks che che terrai salvato da qualche
parte.
Windows può avere più hooks *installati* contemporaneamente, e può anche
avere
lo stesso tipo di hook installato più volte.
Esempio:
Dichiariamo una variabile che possa contenere il riferimento all'hook che
andremo ad installare...
var
  HookHandle : integer = 0;
definisco la procedura di callback...
Tale procedura verrà chiamata al verificarsi dell'evento associato all'hook
installato...
function HookProcedure(code: Integer; wParam: WPARAM;  lParam: LPARAM):
LRESULT stdcall;
begin
  .........
    {se vuoi che l'evento possa essere gestito anche dai successivi hooks
installati scrivi}
    Result := CallNextHookEx( HookHandle, code, wParam, lParam )
end;
Nella sezione initialization *installiamo* l'hook
initialization
begin
  {collego l'hook per il thread corrente, quindi per l'applicazione
corrente....}
  HookHandle := SetWindowsHookEx( WH_CBT,
    HookProcedure, 0, GetCurrentThreadId );
end;
Nella sezione finalization *disinstalliamo* l'hook
finalization
begin
  UnhookWindowsHookEx( HookHandle );
end;
--
Acqua

 [...]
Grazie, ora penso di aver capito cosa sono e a cosa servono gli Hook.
Tuttavia, se ho ben capito quello che dice l'Help, sembrerebbe che
l'Hook CMB intercetti tutte le finestre create e distrutte e non
soltanto le MessageBox.
Ho visto che esiste anche il MsgFilter, tuttavia viene attivato
soltanto quando l'utente risponde a una MessageBox e non anche quando
viene creata.
Invece io vorrei intercettrare separatamente l'apertura e la chiusura
soltanto delle MessageBox. E' possibile?

 [...]
Ho scritto CMB, ma intendevo ovviamente CBT.