Newsgroup: it.comp.lang.visual-basic
Titolo: [?]MouseHook

Auguri a tutti, e scusate il momento indiscreto.
Sto cercando di intercettare l'hook del mouse tramite l'Ape
    Hook = SetWindowsHookEx(WH_MOUSE + WH_CALLWNDPROC, AddressOf
MouseIsMoving, 0&, GetCurrentThreadId())
Dove MouseIsMoving č la mia sub di callback.
La sua dichiarazione in C č
LRESULT CALLBACK MouseProc(
  int nCode,      // hook code
  WPARAM wParam,  // message identifier
  LPARAM lParam   // mouse coordinates
);
lParam punta ad una struttura MOUSESTRUCT, wParam non si sa nemmeno di che
tipo sia.
Dato che non sono un granchč in C, qualcuno mi saprebbe dire come tradurre
questa dichiarazione in VB?
Io ho fatto cosě:
Sub MouseIsMoving(ByVal nCode As Integer, ByVal wParam As Long, ByVal lParam
As MUSEHOOKSTRUCT)
Ma qualcosa non funziona: mi ritornano tutte 0 e lParam addirittura NOTHING!
Aiuto!
Inoltre ho notato che la sub di callback viene richiamata continuamente,
indipendentemente dal fatto che il mouse si muova o no. Dove sbaglio ancora?
Ciao, e grazie.

TI posso dire che in WIN 32 WPARAM e LPARAM sono definiti come numeri su 32
bit.
Ciao

indipendentemente dal fatto che il mouse si muova o no. Dove sbaglio
ancora?
Perché chiami WH_FOREGROUNDIDLE, come ho spiegato prima.
Saluti,
Domenico

...
Ti ringrazio per la risposta (finalmente qualcuno che ne capisce qualcosa!)
Però adesso ci sono ancora un paio di problemi:
Ho cambiato la chiamata così:
Hook = SetWindowsHookEx(WH_MOUSE, AddressOf MouseIsMoving, 0&,
GetCurrentThreadId())
Ed ho tolto il ByVal a lParam (funziona! prima non andava perchè come mi
dicevi facevo un hook sbagliato)
Però
1) L'evento mouse ora lo intercetto io, ma non mi viene più processato da
Windows, con conseguente pseudo-inchiodamento della mia applicazione.
E non va bene... a me serve monitorare la posizione del mouse, ma poi tutto
deve funzionare normalmente!
2) Riesco a legare l'hook solo alla mia applicazione.
Come devo fare per fare un hook a livello di sistema?
Ho provato a sostituire GetCurrentThreadId() con 0&, ma non mi sembra
funzioni
Mi sembra cioè di avere lo stesso problema di Salvatore Clemente, così se
qualcuno mi risponde in realtà aiuta due persone in un colpo solo.
Qualcuno è in grado di darmi ancora una mano?
Ciao a tutti.

funzioni
Su questo ho già risposto nell'altro thread. Riassumendo, non puoi farlo da
VB perché la funzione di hook deve stare in una dll standard (che VB non può
compilare), perché la funzione ha bisogno di mapparsi nello spazio di
indirizzamento delle varie applicazioni, cosa che può fare solo una dll
standard.
Saluti,
Domenico

Scusate ma tanto per far seguire (e magari imparare) il discorso un pò a
tutti:
COSA SONO GLI HOOK del MOUSE??
Grazie
Ciao
--
Pa...@citynet.re.it
 (togliere una k dall'indirizzo)

ciao,
devi usare la costante WH_JOURNALRECORD, per maggiori informazioni
guarda syshook sul sito comune.
Per farla funzionare col mouse devi modificare la funzione di callback
in questo modo:
MemToArray xMsg, lParam, Len(xMsg)
Form1.List1.AddItem Hex$(xMsg.message) & " " & Hex$(xMsg.wParam) & " "
& Hex$(xMsg.lParam)
Form1.List1.ListIndex = Form1.List1.ListCount - 1
HookProc = CallNextHookEx(hHook, nCode, wParam, lParam)
Ciao e buon lavoro
Roberto


Ok, la mia situazione è questa:
Sto tentando di creare una classe che mi intercetti il mouse
La procedura che instanzia l'hook è un metodo di questa classe, che chiamerò
mh
Nella mia Sub di callback (MouseIsMoving()) prima di uscire chiamo
mh.ProcessMsg([...])  che al suo interno altro non fa che chiamare la
fatidica CallNextHookEx()
Il fatto è che in un metodo di classe non posso passare come parametro una
struttura (MOUSEHOOKSTRUCT) il che mi costringe a passare al suo posto il
puntatore, quindi
mh.ProcessMsg([...], VarPtr(lParam))
la Dichiarazione di ProcessMsg() è
Public Sub ProcessMsg([...], ByVal lParam As Long)
Ed ho cambiato anche la dichiarazione di CallNextHookEx() modificando lParam
As Any in ByVal lParam As Long
Ora mi aspetterei che tutto funzioni, invecie NON FUNZIONA UN ACCIDENTI...
Penso che il mio sbaglio sia nella conversione struttura-puntatore e suo
passaggio alle sub, perchè gli altri parametri li passo così come richiesti
(non sono di nessuno strano tipo)
Grazie ancora, Ciao.

...


Sto cercando di intercettare l'hook del mouse tramite l'Ape ...
hem.... dunque... francamente non ho capito molto bene cosa vuoi fare,
ma posso dirti una cosa: l'hook WH_MOUSE e' un casino da usare, come
ti hanno gia' detto ci vuole la dll per controllare tutto win...
io ho fatto un contakm per il mouse, e per registrare gli eventi ho
usato il WH_JOURNALRECORD, che puoi chiamare senza problemi da vb e
con la funzioncina interna, solo che non puoi influire sul loro corso,
cioe' non puoi decidere di non processare l'evento che arriva... in
sostanza vedi tutti gli eventi che passano e basta.
non so, se credi che possa esserti d'aiuto spiegami meglio cosa
intendi fare, magari ho qualche sorgente che fa al caso tuo...
ciaociao
Francesco Mapelli ( 
mape...@tin.it
 )
il contakm per il mouse:
http://members.xoom.com/mousestats
sito comune programmatori vb
http://members.xoom.com/it_lang_vb

Sě, perché prima della fine della funzione di hook devi chiamare la
funzione



Forse in un certo senso hai ragione.
Si potrebbe fare un loop in cui si va a leggere continuamente
la posizione del mouse con la GetCursorPos, poi con queste
coordinate si potrebbe risalire alla window sottostante con
la WindowFromPoint, e dal suo handle fare quello che si vuole.
Sarebbe il caso di provare.
Ciao e buon anno!
sal...@tin.it
http://freeware.freeweb.org