Newsgroup: it.comp.programmare.win32
Titolo: UnhookWindowsHookEx successivo

uso
 
hook = SetWindowsHookEx(WH_MOUSE,proc,GetModuleHandle(L"hook"),0);
 
per registrare un hook
ma come faccio a rilasciarlo dopo essere uscito dal programma?
 
UnhookWindowsHookEx(hook);
 
funziona solo se lanciato nello stesso processo.


In che senso "dopo essere uscito dal programma"?
Non puoi farlo prima di uscire dal programma, quindi nello stesso processo?
 

Kan ha scritto quanto segue il 12/12/2011 14.24>

No, io lancio l'exe che con l'hook intercetta i movimenti del mouse.
Perņ ad un certo punto voglio far cessare l'intercettazione e rilancio 
l'exe. Ma al secondo lancio non so come chiudere il precedente hook.

On Sat, 10 Dec 2011 10:55:37 +0100, compi <co...@yahoo.com.invalid>
wrote:

Devi inserire il codice in una libreria (DLL) visto che stai usando un
HOOK di sistema.

xnoise ha scritto quanto segue il 13/12/2011 18.45>

quello è sottinteso è non il problema in oggetto.
Poi eseguo:
rundll32 hook.dll,inst
e la dll rimane in esecuzione
il problema e farla smettere.
la devo killare o posso spegnere l'hook.

la devo killare o posso spegnere l'hook.
 
la DLL dovrebbe implementare entrambe le funzioni per impostare e
rilasciare l'hook.Da tuo programma puoi importare e usre queste
funzioni .  Ricorda inoltre che la DLL gestisce dei messaggi
DLL_ATTACH  e DLL_DETACH a cui puoi far corrispondere l'attivazione e
la disattivzione dell'hook.

 funzioni .
 
Lo so, ma come?!?
La dll non è un altro programmo che uso ma è quella che sto scrivendo e 
in cui ho il problema.


1) Crei un exe che usa la dll.
2) All'avvio dell'exe crei l'hook, chiamando la funzione "inst".
3) Alla chiusura dell'exe distruggi l'hook, chiamando un'apposita 
funzione che crei sulla dll. Oppure, distruggi l'hook sul DllMain quando 
ti arriva il DLL_DETACH (o sulla ExitInstance, se è una dll MFC).
4) Per installare l'hook, lanci l'exe.
5) Per disinstallare l'hook, termini l'exe.
 

 ti arriva il DLL_DETACH (o sulla ExitInstance, se è una dll MFC).
 
Ma siamo punto e d'accapo.
Come creo l'apposita funzione?

Come creo l'apposita funzione?
 
EXPORT BOOL APIENTRY InstallMouseBlockingHook (HWND hwnd, BOOL
bInstall)
{
     if (bInstall)
     {
 
          hHookBlocking = SetWindowsHookEx (WH_MOUSE,
MouseBlockingHookProc, 
                                                      hLibrary, 0) ;
 
     }
     else
     {
          return UnhookWindowsHookEx (hHookBlocking) ;
     }
}
 

xnoise ha scritto quanto segue il 14/12/2011 19.24>

Ma io fatto cosě ma non mi funziona.
Quando lo eseguo la seconda volta per disinstallarlo la variabile 
hHookBlocking non č undefined? e come fa allora funzionare 
l'UnhookWindowsHookEx?

l'UnhookWindowsHookEx?
 
L'installazione e disinstallazione dell'hook dovrebbe avvenire sempre
entro lo stesso programma. 
 
Before terminating, an application must call the UnhookWindowsHookEx
function to free system resources associated with the hook. 
 
 


e lo so, ma siamo al punto iniziale.
allora non è possibile quello che chiedo?
usare
rundll32 hook.dll,inst
per installarlo
e
rundll32 hook.dll,uninst
per disinstallarlo
Perché "istanzierebbe" due programmi diversi?

rundll32 hook.dll,inst
 
Ma perche usare questa forma ?
Basta semplicemente tenere in esecuzione il prog che installa e
disinstalla l'hook. Puo anche stare in background e lanciargli i
messaggi per installare e disinstallare quando necessita.
 


Ma perche usare quest'altra forma ?
Se fosse possibile farlo senza exe aggiuntivi da tenere in esecuzione?
Si gira attorna alla domanda ma non si trova risposta.

 Si gira attorna alla domanda ma non si trova risposta.
 
Perchè parli di exe aggiuntivi?
Se hai già un exe, invece di chiamare rundll32, devi richiamare la 
funzione della dll dal TUO exe.
Puoi linkare staticamente la dll, oppure dinamicamente utilizzando le 
funzioni LoadLibrary, GetProcAddress e FreeLibrary.
 
 

 Si gira attorna alla domanda ma non si trova risposta.
 
Scusa ma se il processo che installa l'hook termina, a chi cazzo serve 
l'hook? Che fine fanno i messaggi intercettati? Non ha minimamente senso 
che l'exe che ha installato l'hook termini prima di rilasciarlo.
 
Tralaltro immagino che se un processo installa un hook e poi termina, il 
so dovrebbe rilasciare automaticamente l'hook.