Newsgroup: it.comp.lang.c
Titolo: Fare cliccare il mouse...

Come si puo' fare a simulare un click del mouse?
In tutto e per tutto come se un utilizzatore premesse un pulsante...

In tutto e per tutto come se un utilizzatore premesse un pulsante...
Dipende, "in tutto e per tutto", dal sistema operativo in
cui lavori; con Win32, ad esempio, l'API mouse_event
puo` fare al caso tuo (in NT 4.0, meglio SendInput).
Alex

In tutto e per tutto come se un utilizzatore premesse un pulsante...
In quale contesto?
Se sei in windows basta forzare un adeguato messaggio nella coda
dell'applicazione.

dell'applicazione.
In Windows e vorrei che funzionasse sia sotto Win95/98 che NT4/5.
Devo usare semplicemente la sendmessage? O in altro modo?
Ciao e grazie.

puo` fare al caso tuo (in NT 4.0, meglio SendInput).
Vorrei che funzionasse sia sottto win95/98 che NT
Ciao e grazie.

...
    [snip]

E allora, come ti ho detto, mouse_event.  Win32 e`
l'insieme di API implementato (piu` o meno bene)
appunto da Windows 95, Windows 98, Windows NT
nei vari release.
mouse_event accetta 5 parametri: uno di flags,
poi due di dx e dy, infine altri due che dovranno
normalmente essere zero.  Quello di flags, che e`
il primo, porta la combinazione in OR di vari bit
fra cui, normalmente, MOUSEEVENTF_ABSOLUTE,
per dare dx e dy come coordinate assolute (se
no, devi darle come variazione rispetto alla ultima
posizione precedente del mouse); con questo bit
settato, dx e dy vanno da 0, 0 per l'angolo in alto
a sinistra dello schermo, a 65535,65535 per l'angolo
in basso a destra dello schermo.
Inoltre, dovrai settare fra i flag il bit MOUSEEVENTF_MOVE
se vuoi specificare che la posizione e` cambiata; e
MOUSEEVENTF_LEFTDOWN per indicare che il bottone
sinistro e` giu`, o (stessa cosa con UP invece di DOWN)
per indicare che e` su (e lo stesso per RIGHT e MIDDLE
al posto di LEFT).
Ad esempio, per simulare un clic del bottone sinistro
al centro esatto dello schermo, con gli altri due bottoni
su (cioe`, non attivati):
    // evento 1: il mouse "si sposta" al centro dello
    //     schermo, dove verra` "cliccato"
    DWORD flags = MOUSEEVENTF_ABSOLUTE |
        MOUSEEVENTF_MOVE |
        MOUSEEVENTF_LEFTUP |
        MOUSEEVENTF_RIGHTUP |
        MOUSEEVENTF_MIDDLEUP;
    mouse_event(flags, 32767, 32767, 0, 0);
    // evento 2: il bottone sinistro si abbassa, a
    //    mouse fermo
    flags = MOUSEEVENTF_ABSOLUTE |
        MOUSEEVENTF_LEFTDOWN |
        MOUSEEVENTF_RIGHTUP |
        MOUSEEVENTF_MIDDLEUP;
    mouse_event(flags, 32767, 32767, 0, 0);
    // evento 3: il bottone sinistro si rialza,
    //    sempre a mouse fermo
    flags = MOUSEEVENTF_ABSOLUTE |
        MOUSEEVENTF_LEFTUP |
        MOUSEEVENTF_RIGHTUP |
        MOUSEEVENTF_MIDDLEUP;
    mouse_event(flags, 32767, 32767, 0, 0);
Il secondo e il terzo evento avremmo, com'e`
ovvio, anche potuto farli senza la _ABSOLUTE,
in questo caso usando 0,0 per dx, dy (io pero`
preferisco usare sempre _ABSOLUTE perche`,
in generale, il comportamento relativo puo`
essere soggetto ad "accelerazioni" secondo
leggi non sotto il mio controllo).
Considero, inoltre, migliore separare il movimento
che porta il mouse al punto dove vogliamo che si
simuli il clic, dal clic vero e proprio (transizione
del bottone su->giu->su), che e` meglio fare a
mouse rigorosamente fermo, ad evitare il rischio
di avere simulato un "drag".
Alex

nei vari release.
[....ziiiip....]
Grazie MILLE e' proprio quello che cercavo! Anche per l'esempio!
Ora tutto sta a come riportare la coordinata assoluta ad una coordinata
relativa alla mia form...ma questo penso sia "relativamente" (che bel gioco
di parole...ah :-) ) semplice...
Ciao!

di parole...ah :-) ) semplice...
Abbastanza!  L'API ClientToScreen (e la sua "inversa", ScreenToClient)
ti permettono di "mappare" fra coordinate di schermo, e coordinate
dell'area-cliente di una qualsiasi finestra a tua scelta -- pero`, queste
ragionano in _pixel_.  Devi quindi scoprire la dimensione in pixel del
tuo schermo, per convertire i pixel "assoluti" in frazione di schermo; a
questo scopo, ti aiuta GetSystemMetrics (con parametri SM_CXSCREEN,
SM_CYSCREEN).  Ci sono anche altre API per arrivare agli stessi
risultati (MapWindowPoints e GetDeviceCaps, ad esempio), ma
queste penso che siano le piu` semplici da usare.
Alex