Mausklicks Simulieren
-
Möglicherweise funktioniert dein Code, wenn du mit WindowFromPoint erst das korrekte (Unter-)Fenster holst.
-
nwp3 schrieb:
Möglicherweise funktioniert dein Code, wenn du mit WindowFromPoint erst das korrekte (Unter-)Fenster holst.
Danke für die Idee, also wenn ich alles richtig gemacht habe bleibt der Effekt gleich.
Es sieht so aus als würde der Cursor auf einer Stelle im Fenster klicken, aber es passiert nichts#include <windows.h> #include <iostream> using namespace std; int main() { POINT mouse; char text[99]; cout <<"Position"<<endl; system("pause"); GetCursorPos(&mouse); HWND handle = WindowFromPoint(mouse); while(1) { SendMessage(handle, WM_LBUTTONDOWN,0,MAKELPARAM(mouse.x,mouse.y)); _sleep(100); SendMessage(handle, WM_LBUTTONUP,0,MAKELPARAM(mouse.x,mouse.y)); _sleep(100); } return 0; }
LG
edit:
Soo ich habe das Problem gelöst, würde aber ganz gerne mal wissen wieso das so funktioniert und anders nicht:
#include <windows.h> #include <iostream> using namespace std; int main() { POINT mouse; cout <<"Bitte den Cursor an die Position halten, wo geklickt werden soll. Dann ENTER drücken"<<endl; system("pause"); GetCursorPos(&mouse); HWND handle = WindowFromPoint(mouse); while(1) { SendMessage(handle,WM_SETCURSOR,0,MAKELPARAM(mouse.x,mouse.y)); PostMessage(handle,WM_LBUTTONDOWN ,0,MAKELPARAM(mouse.x,mouse.y)); SendMessage(handle,WM_SETCURSOR,0,MAKELPARAM(mouse.x,mouse.y)); PostMessage(handle,WM_LBUTTONUP ,0,MAKELPARAM(mouse.x,mouse.y)); _sleep(10); } return 0; }
Warum muss ich ihm noch einmal extra sagen das er den Cursor dahin schieben soll?
-
Ich bin mir mittelmäßig sicher, dass deine Koordinaten falsch sind. Der Mauscursor muss in absoluten Koordinaten angegeben werden, während die Koordinaten von WM_LBUTTONDOWN relativ zum Fenster sind. Du machst damit einen unmöglichen Klick (außerhalb des Fensters geklickt und trotzdem ins Fenster geklickt). Weiterhin ist dein wParam 0. Also nicht MK_LBUTTON. Die linke Maustaste wurde gedrückt (WM_LBUTTONDOWN), aber die linke Maustaste ist nicht gedrückt (kein MK_LBUTTON)... Kann mir vorstellen, dass dadurch Fenster verwirrt werden.
Ich bin mir weiterhin ziemlich sicher, dass du kein WM_SETCURSOR brauchst. Der Cursor muss nicht dort sein wo geklickt wird. Das sollte auch dein Flackerproblem beheben.
-
Ich glaube du hast mich falsch verstanden..
Der untere Code funktioniert jetzt problemlos.
Es flackert auch nichts.Aber wieso muss ich denn dem Cursor zwei mal sagen wo er hingehen soll?
-
Ich vermute, dass WM_SETCURSOR als Nebeneffekt die falschen Koordinaten und Messages korrigiert und das System wieder in einen vernünftigen Zustand bringt. Mit anderen Worten: Reiner Zufall, auf einer anderen Windoof-Version gehts wahrscheinlich schon nicht mehr.
-
Okay danke, aber was sind denn "absolute koordinaten"
-
Grinskeks schrieb:
Okay danke, aber was sind denn "absolute koordinaten"
Koordinaten relativ zum Primärbildschirm oben links. Den Begriff hatte ich mir spontan ausgedacht, vielleicht heißt das anders.
-
Screen-Koordinaten wäre klarer/üblicher, aber absolute Koordinaten ist auch nicht total unüblich/unverständlich.
-
'tschuldige aber ich weiß immer noch nicht so ganz genau, was an meinen Koordinaten falsch sein soll.
LG
-
Angenommen dein Zielfenster ist ein Button bei Bildschirmkoordinate 500, 500 und er ist 100 * 30 groß. Wenn jetzt ein Klick an Bildschirmkoordinate 510, 520 kommt, dann wird der Button geklickt und bekommt in seiner WM_LBUTTONDOWN die Koordinaten 10, 20 und nicht 510, 520.
510, 520 ist unmöglich, denn der Button ist nur 100 * 30 groß. Du solltest also dein MAKELPARAM(mouse.x,mouse.y) in MAKELPARAM(mouse.x - fenster.x, mouse.y - fenster.y) ändern. Mit GetWindowRect kriegst du die Fensterkoordinaten.
-
Vielen vielen Dank!
Jetzt habe ich das verstandenedit:
Du hattest recht es Fuktioniert. Nochmals danke für deine Hilfe
der Thread kann denke ich geschlossen werden:p
#include <windows.h> #include <iostream> #include <cstdlib> #include <conio.h> using namespace std; int main() { POINT mouse; //Point Strukur für die Maus RECT fenster; //Rect Struktur für das Fenster while(1) { char eingabe; system("cls"); cout <<"Bitte den Cursor an die Position halten, wo geklickt werden soll."<<endl; system ("pause"); GetCursorPos(&mouse); HWND handle = WindowFromPoint(mouse); //Sucht sich das entsprechende Unterfenster GetWindowRect(handle,&fenster); //Speichert die Fenster Koordinaten in eine RECT Struktur while(1) { system("cls"); cout <<"Starte Klickvorgang, fuer Pause bitte Linke Shift Taste benutzen!"<<endl; SendMessage(handle,WM_LBUTTONDOWN ,MK_LBUTTON,MAKELPARAM(mouse.x-fenster.left,mouse.y-fenster.top)); SendMessage(handle,WM_LBUTTONUP ,MK_LBUTTON,MAKELPARAM(mouse.x-fenster.left,mouse.y-fenster.top)); _sleep(10); if(GetAsyncKeyState(VK_LSHIFT)) //Wurde die Taste LSHIFT gedrückt? { cout <<"Pausiert... Erneut an gleicher Stelle klicken 1) oder neue Position? 2)"<<endl; cin >>eingabe; } } } return 0; }