PDA

View Full Version : [C++] Simulare Evento Mouse in "Background"


Valas
06-03-2010, 20:22
Ciao!

Stò cercando di fare una funzione che simuli il click del mouse in una finestra precisa. Questa finestra non deve neccessariamente essere aperta, ma può anche essere minimizzata sulla barra, o dietro altre finestre!
L'importante è che questa operazione non deve disturbarti se stai facendo altro! (se no sarebbe troppo facile xD)

Ho provato a usare SendMessage per mandargli un input ma non mi va, senz'altro ho sbagliato qualcosa perchè ho poco familiarità con questa funzione...

L'ideale sarebbe poter quindi creare una funzione:

Clicca_in_Finestra(HWND Finestra, int X, int Y)

Avete qualche idea? :confused:

fero86
08-03-2010, 10:14
il metodo é quello, devi usare SendMessage; fai vedere il codice che hai scritto. se proprio non riesci a farlo funzionare aiutati con Spy++, per esempio controlla che l'handle della finestra che passi a SendMessage sia corretto. poi, che messaggio passi? un click di mouse ne coinvolge piu d'uno, per esempio WM_LBUTTONDOWN e WM_LBUTTONUP. qui hai la lista completa dei messaggi relativi alla gestione del mouse: http://msdn.microsoft.com/en-us/library/dd458632(VS.85).aspx

Valas
08-03-2010, 16:58
Alla Fine ho risolto così:

void Clicca(HWND Handle, int X, int Y)
{
X -= 3; // E' il bordo...
Y -= 25;
long lparm = (Y << 16) | X;
SendMessage(Handle, WM_LBUTTONDOWN, 0, lparm);
SendMessage(Handle, WM_LBUTTONUP, 0, lparm);
}

Anche se non ho capito cosa fa questa Riga: long lparm = (Y << 16) | X;
Ho copiato il codice già fatto e mi ha funzionato, anche se ho dovuto aggiustare con:
X -= 3;
Y -= 25;
Perchè in pratica io calcolavo i punti con le coordinate del mouse meno le coordinate della finestra, ma il SendMessage fa riferimento a una diversa partenza, che dipende dal "bordo" della finestra, anche se non è esattamente la lunghezza del bordo... e ho fatto la correzione manualmente in riferite alle mie impostazioni... che fa un po' schifo ma ditemi voi se avete qualche soluzione più elegante.