Newsgroup: it.comp.programmare.win32
Titolo: Aiuto HOOK

Salve ragazzi, sono nuovo del gruppo e ho un problema.
Devo intercettare la pressione di un pulsante di una finestra (quella
di Avviso di Protezione) e magari cambiare il pulsante premuto.
Ad esempio fare in modo che premendo il tasto Yes succeda la stessa
cosa che premendo il tasto More Info...
Usando gli hook sul mouse intercetto il messaggio WM_LBUTTONDOWN; se
nella callback mi limito a cambiare l'handle del bottone a cui e'
destinato il messaggio tutto funziona a dovere; se invece voglio
mostrare una "finestra di avviso" (fatta da me) e poi cambiare
l'handle, non funziona. Cioe' il messaggio viene intercettato, la
finestra mostrata, ma poi e' come se la pressione del tasto si
perdesse nel nulla. Inoltre appena la "finestra di avviso" scompare,
ad ogni click del mouse (ovunque esso sia) questa ricompare
apparentemente senza motivo.
 Ecco qui il codice della callback:
LRESULT CALLBACK catturaEvento(
  int code,       // hook code
  WPARAM wParam,  // undefined
  LPARAM lParam   // address of structure with message data
)
{
	CDialog1 dialogSi;
 
	if (code < 0)
		return CallNextHookEx(settato, code, wParam, lParam);
	else{
		messaggio = (MSG*)lParam;
		if ((messaggio->message) == WM_LBUTTONDOWN &&
(DWORD)(messaggio->hwnd) == hYes){
			messaggio->hwnd = hInfo;
			dialogSi.DoModal();  //COMANDO INCRIMINATO
		}
 
	}
	return CallNextHookEx(settato, code, wParam, lParam);
}
///end code
Dove hYes e hInfo sono gli handle dei bottoni della finestra e
messaggio e' un MSG*.
Please help me Grazie.

 l'handle, non funziona.
E` una pessima idea aprire una dialog da dentro una hook procedure: meno
tempo si sta dentro alle callback, meglio e`. Ti consiglio di fare la cosa
in maniera asincrona, ad esempio:
-Settando un evento dentro alla hook procedure, e aprendo la dialog da un
altro thread;
-Postando un messaggio utente dalla callback, che sara` ricevuto da una
finestra che mostrera` la dialog.
-- 
Lorenzo

Innanzi tutto grazie, ma visto che non sono un GURU della programmazione
mi potresti spiegare meglio il procedimento da te descritto?
Ti ripeto quello che vorrei fare:
1) Quando l'utente clicca sul sě della finestra "Avviso di protezione"
vorrei mostrare un'altra finestra di "Alert" che domanda "Sei sicuro?"
2) Se si risponde sě allora il messaggio deve passare e il tasto Yes della
finestra di "Avviso di protezione" si deve premere
3) Se si risponde no allora il messaggio deve essere distrutto e la
finestra "Avviso di protezione" deve rimanere tale e quale.
Questo sarebbe il massimo. Se avete altri suggerimenti...sono ben accetti.
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 quale.
Per fare una cosa del genere credo che sia piu` comodo e adatto subclassare
la finestra "avviso di protezione". Lo hook ti serve lo stesso (perche`
dovrai "iniettare" il tuo codice dentro a un altro processo), ma poi la
tecnica e` diversa. E` un po' difficile spiegarlo in parole povere, si
tratta di argomenti decisamente non banali; ti consiglio di leggere
"Advanced Windows Programming" di Richter, li` molte delle cose che ti
servono sono descritte bene.
Comunque per darti un assaggio le cose da fare saranno:
-Iniettare il tuo codice nel processo remoto usando gli hook;
-Trovare la window procedure della dialog usando GetWindowLong();
-Cambiare tale window procedure con la tua usando SetWindowLong();
-Nella tua window procedure gestire il comando corrispondente al pulsante
OK, e poi (se e` il caso) "passare" la gestione alla window procedure
principale.
-- 
Lorenzo