|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Member
Iscritto dal: Jan 2008
Messaggi: 41
|
[C++] Simulare Click mouse/Immagini
Allora raga devo fare un programma abbastanza complesso, ho quasi finito ma mi sono bloccato su un particolare aspetto.
Innanzitutto premetto che stò utilizzando Visual Studio 2008 e programmo in C++. 1- Mi servirebbe una funzione che simula il click sinistro del mouse ogni tot secondi. Su internet ho trovato alcune funzioni ma non mi vanno... 2- Ho bisogno di una funzione che cambia finestra di windows (ovvero va alla finestra chiamata tal de tali) e catturi un immagine: un quadrato che va da X1,Y1 a X2,Y2 della finestra tal de tali. Dopodichè dovrebbe confrontare questa immagine catturata con varie immagini in archivio e vedere se sono perfettamente identiche. Non ne ho idea di come si fa... PS: Nn pensate male non mi serve per niente di losco Grazie in anticipo per qualunque aiuto e suggerimento! |
|
|
|
|
|
#2 |
|
Member
Iscritto dal: Jan 2008
Messaggi: 41
|
Up
Nessuno può aiutarmi? plssssssssssssssssssssssss |
|
|
|
|
|
#3 | |
|
Senior Member
Iscritto dal: Mar 2007
Messaggi: 1792
|
Quote:
|
|
|
|
|
|
|
#4 |
|
Member
Iscritto dal: Jan 2008
Messaggi: 41
|
Qualcosa di più sul punto 1?
In particolare servirebbe il codice di una funzione in C++ così: Click(WindowName, X, Y); Ovvero dando il nome di una finestra e le coordinate XY, relative al punto dove clikkare della finestra, effettui subito un Click.... ringrazio in anticipo per qualunque aiuto |
|
|
|
|
|
#5 | |
|
Senior Member
Iscritto dal: Mar 2007
Messaggi: 1792
|
Quote:
|
|
|
|
|
|
|
#6 |
|
Junior Member
Iscritto dal: Apr 2007
Messaggi: 17
|
The mouse_event function synthesizes mouse motion and button clicks.
Windows NT/2000/XP: This function has been superseded. Use SendInput instead. direttamente dall'SDK di zio Bill. PS: mouse_event su winxp funziona non so su Vista e successivi |
|
|
|
|
|
#7 |
|
Member
Iscritto dal: Jan 2008
Messaggi: 41
|
ho risolto il punto uno, ma per il punto 2 che io sappia l'unica soluzione è di prendere le due immagini e confrontarle con getpixel()...
un pixel alla volta : \ mi sà che è lunga la cosa.... anche perchè mi dicevano che come funzione è abbastanza lenta... Cmq non saprei nella pratica come aprire l'immagine che ho salvato(magari è anche semplice) Qualche altra soluzione? :| |
|
|
|
|
|
#8 |
|
Member
Iscritto dal: Jan 2008
Messaggi: 41
|
Raga ho un problema con getpixel perchè mi restituisce sempre lo stesso valore: 4294967295
che per quanto capito è un valore "errore". codice: Codice:
POINT pt;
HWND GHandle()
{
return FindWindow(NULL, "Finestra");
}
HDC hdc = GetDC(GHandle());
GetCursorPos(&pt);
GetPixel(hdc,pt.x,pt.y)
|
|
|
|
|
|
#9 |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
non serve che confronti pixel per pixel con GetPixel, anche perché ti hanno detto bene: ci metteresti una vita. devi ottenere i bits di ciascuna immagine con GetDIBits e confrontare i due buffers di memoria con una semplice memcmp.
|
|
|
|
|
|
#10 |
|
Member
Iscritto dal: Jan 2008
Messaggi: 41
|
Perfetto grazie mille adesso ci lavoro.
In ogni caso sai come mai mi dà questo errore? Perchè lo devo cmq usare una volta... |
|
|
|
|
|
#11 |
|
Member
Iscritto dal: Jan 2008
Messaggi: 41
|
Una cosa:
Io devo prelevare un immagine rettangolare che parte da XY e arriva a X2Y2, di una specifica finestra! Poi se ce l'ho riesco a confrontarla ma come faccio ad averla? °_° Ho trovato solo funzioni che catturano l'intera immagine di finestre.... |
|
|
|
|
|
#12 |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
probabilmente perché le coordinate che specifichi stanno fuori dal rettangolo della finestra: GetCursorPos restituisce coordinate relative al riferimento cartesiano dello schermo (origine degli assi in alto a sinistra, tipicamente fuori dalla tua finestra), GetPixel invece vuole coordinate relative al riferimento della finestra (origine sull'angolo superiore sinistro della finestra).
per convertire usa ScreenToClient o ClientToScreen. |
|
|
|
|
|
#13 | |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
Quote:
|
|
|
|
|
|
|
#14 | |
|
Member
Iscritto dal: Jan 2008
Messaggi: 41
|
Quote:
Grazie adesso provo : D tanto su msdn se sò il nome delle funzioni li trovo fast ty |
|
|
|
|
|
|
#15 | ||
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
Quote:
EDIT - o magari la FindWindow Quote:
|
||
|
|
|
|
|
#16 | |
|
Member
Iscritto dal: Jan 2008
Messaggi: 41
|
scusa ma mi sono incasinato di brutto...
quello che ho capito: Codice:
HWND GHandle()
{
return FindWindow(NULL, "Finestra");
}
HDC hdc = GetDC(GHandle());
x = 100; y = 100;
HDC hdc2 = CreateCompatibleDC(hdc);
HBITMAP bitmap = CreateCompatibleBitmap(hdc2, 250, 250);
SelectObject(
hdc, // handle to DC
bitmap // handle to object
);
BitBlt(
hdc2, // handle to destination DC
x, // x-coord of destination upper-left corner
y, // y-coord of destination upper-left corner
250, // width of destination rectangle
250, // height of destination rectangle
hdc, // handle to source DC
x, // x-coordinate of source upper-left corner
y, // y-coordinate of source upper-left corner
MERGECOPY
);
// qua proprio mi perdo nel nulla
LPVOID bits;
LPBITMAPINFO bitm;
GetDIBits(
hdc2, // handle to DC
bitmap, // handle to bitmap
NULL, // first scan line to set
NULL, // number of scan lines to copy
bits, // array for bitmap bits
bitm, // bitmap data buffer
DIB_RGB_COLORS // RGB or palette index
};
Come faccio a salvare l'immagine che ne esce in maniera permanente e poi ad aprirne una mia e a confrontarla? Se mi fate vedere il codice ve ne sarei grato grazie... (scusate l'ignoranza ma per me è un aspetto completamente nuovo) Quote:
tipo 880119B8, quindi direi che funziona. Ultima modifica di Valas : 15-06-2008 alle 23:32. |
|
|
|
|
|
|
#17 | |||
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
Quote:
http://msdn.microsoft.com/en-us/libr...40(VS.85).aspx Quote:
Quote:
|
|||
|
|
|
|
|
#18 |
|
Member
Iscritto dal: Jan 2008
Messaggi: 41
|
Ok grazie, ma il codice che ho scritto è giusto? Mi sembra assurdo che non abbia fatto qualche casino
|
|
|
|
|
|
#19 | |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
Quote:
![]() pare che alla documentazione tu abbia dato solo un'occhiata fugace. non essere assetato di risultati perché Win32 è complesso e con la fretta non ne avrai mai: non ci sono scorciatoie, leggi tutto quello che devi leggere e vedrai che non ti... "perderai nel nulla". qualche osservazione: - controlla sempre i valori di ritorno per eventuali errori: se si è verificato un errore non continuare, libera tutte le risorse allocate ed esci. - come mai nella BitBlt hai specificato x e y (cioè, 100-100) come coordinate dell'uper-left corner del rettangolo di destinazione? non dovrebbero essere 0-0 ? - sempre nella BitBlt, non sarebbe meglio SRCCOPY? come mai hai passato MERGECOPY? - quando devi passare uno zero numerico evita di usare la costante NULL: quella in genere si usa solo per i puntatori. - alla GetDIBits stai chiedendo di restituirti precisamente zero scanlines, cioè le stai chiedendo di non copiarti nulla nel buffer. - non hai inizializzato ne' la variabile bits ne' la variabile bitm. |
|
|
|
|
|
|
#20 |
|
Member
Iscritto dal: Jan 2008
Messaggi: 41
|
Grazie per la pazienza!
Innanzitutto ti dico che sono più niubbo di quanto sembro... e sembro parecchio niubbo! nella BitBlt ho specificato per provare 100-100 perchè sono le coordinate dove devo iniziare il rettangolo da copiare. non chiedermi perchè l'ho messo 2 volte... Il fatto è che già di inglese sò poco e quindi su msdn capisco il 50% delle cose... In ogni caso così è troppo complicato per i miei gusti, ho risolto il problema del getpixel che insensatamente il problema era che il nome della finestra era "finestra " e non "finestra"... Ovvero se ci aggiungo uno spazio in fondo va se no no.... Anche se alla fine la funzione che mi metteva in primo piano la finestra funzionava cmq.... Comunque ho deciso di usare GetPixel prelevando dei pixel "campione" tipo 10 pixel di cui confronto il colore, se sono uguali allora ritengo tutta l'immagine uguale... se non è più veloce sicuramente è meno snervante per la mia testolina : P |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 19:32.





















