Mausklick ausführen, ohne Mauszeigerbewegung.
Aloa ihr´s,
war ja schon lange nicht mehr hier. Ich habe mal ein kleines Problemchen, welches mir noch nicht zu lösen gelang. Wie es der Titel dieses Thread schon aussagt, suche ich nach einer Möglichkeit einen Mausklick auszuführen ohne das dafür der Mauszeiger bewegt werden muss. Ich weis nicht ob das in Wunschdenken endet oder gar doch möglich ist, denn in den Weiten des Internets habe ich nicht´s dazu gefunden. Für´s 100% verständliche: Sagen wir der Mauszeiger befindet sich an der Desktop Position x:300/y:700, nun möchte ich einen Mausklick simulieren der auf der Position x:800/y:500 ausgeführt werden soll. Mir ist bekannt, dass ich die Maus unteranderem per SetCursorPos an diesen Zielpunkt hinbewegen kann, mein Versuch ist es aber nun, den Klick ohne jeglicher Bewegung des Cursor´s an der angestrebten Koordinate auszuführen, woran ich derzeit allerdings scheiterte. Über PostMessage und Mouse_Event bin ich zu keinem Ergebnis gekommen, kennt da einer von euch vielleicht eine Möglichkeit?, oder bleibt es doch nur eine Vorstellung. Mit freundlichem Gruß Lostriga |
Re: Mausklick ausführen, ohne Mauszeigerbewegung.
Du willst also nur an irgendeine bestimmte Stelle klicken und nicht auf einen Button der dergleichen?
|
Re: Mausklick ausführen, ohne Mauszeigerbewegung.
Was spricht gegen folgendes?
Delphi-Quellcode:
procedure TForm.MakeMouseClick(AP: TPoint);
var P:TPoint; begin if GetCursorPos(P) then begin SetCursorPos(AP.X, AP.Y); Mouse_Event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0); Mouse_Event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0); SetCursorPos(P.X, P.Y); end; end; |
Re: Mausklick ausführen, ohne Mauszeigerbewegung.
Aloa,
danke für die raschen Antworten. @ s.h.a.r.k Ja ich möchte einfach einen Mausklick an einer bestimmten Position ausführen, das halt ohne den Cursor zu bewegen. @ omata Deine eventuelle Lösung sieht interessant aus, doch leider kann ich grad nicht´s mit dem (AP: TPoint) in der Procedure anfangen. Wärst du so lieb und würdest das mit etwas mehr Quelltext erklären? Mit freundlichem Gruß Lostriga |
Re: Mausklick ausführen, ohne Mauszeigerbewegung.
Ok...
Aufruf:
Delphi-Quellcode:
var P:TPoint;
begin P.X:=100; P.Y:=100; MakeMouseClick(P); end; |
Re: Mausklick ausführen, ohne Mauszeigerbewegung.
Aloa,
ich weis nicht, aber ich glaube ich steh auf´m Kopf. Das sagt mir nun dennoch nichts, es ist dieses direkte (AP: TPoint), welches in der Procedure steht womit ich gerade nicht klar komme. Bei mir kommt halt immer ein (Sender: TObject), mit eventuellem var, jenachdem welches Ereignis halt. Ich komme grad halt nicht auf das (AP: TPoint), weist was ich meine?, was hast du da benutzt? Mit freundlichem Gruß Lostriga |
Re: Mausklick ausführen, ohne Mauszeigerbewegung.
Ne, kann deine Probleme nicht nachvollziehen.
Versuche es deshalb mal so, in der Hoffnung, dass dir das besser gefällt:
Delphi-Quellcode:
Edit: Du must doch irgendwo diese Routine Aufrufen wollen? Wo kommen die Koordinaten her, an denen du den Mausklick durchführen möchtest?
procedure TForm.MakeMouseClick(X, Y:integer);
var P:TPoint; begin if GetCursorPos(P) then begin SetCursorPos(X, Y); Mouse_Event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0); Mouse_Event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0); SetCursorPos(P.X, P.Y); end; end; |
Re: Mausklick ausführen, ohne Mauszeigerbewegung.
Kurz zur Klärung: Dieses AP: TPoint ist der Zielpunkt, an dem geklickt werden soll. Du musst doch irgendwoher diesen Punkt haben. Nun musst halt entweder eine Methode schreiben, was ich auf jeden Fall rate, oder du packst es irgendwie in eine Klasse.
|
Re: Mausklick ausführen, ohne Mauszeigerbewegung.
MakeMouseClick ist doch eine eigene Methode.
|
Re: Mausklick ausführen, ohne Mauszeigerbewegung.
Mein Kommentar war für Lostriga. Ich denke er hat noch nicht ganz verstanden, wo der Punkt herkommt.
|
Re: Mausklick ausführen, ohne Mauszeigerbewegung.
Aloa,
ich habe nun mal bei mir so ein bisschen "rumgepfuscht", das (Sender: TObject) sowohl im type als auch in der Procedure durch (AP: TPoint) bzw. (X, Y:integer) ersetzt und sowas. (kam nur Mist herraus) Methoden erstellen sich ja durch das Doppelklicken auf die Elemente bzw. durch die Benutzung der Ereignisleiste der jeweilige Elemente. Erfahrung mit dem schreiben von eigenen Methoden, ohne (so scheint es mir grad) einem Element, habe nicht so. *nicht meinen Kopf abreißen >_<* Mit freundlichem Gruß Lostriga |
Re: Mausklick ausführen, ohne Mauszeigerbewegung.
Dann fehlen dir einige Grundlagen. Ich denke, dass es besser sein wird, dass du dir ein paar Delphi-Tutorials durchliest und dann hier weiter machst. Denn sonst wirst du nur seeeehr schwer ans Ziel kommen.
|
Re: Mausklick ausführen, ohne Mauszeigerbewegung.
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var P:TPoint; X, Y:integer; begin X:=100; Y:=100; if GetCursorPos(P) then begin SetCursorPos(X, Y); Mouse_Event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0); Mouse_Event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0); SetCursorPos(P.X, P.Y); end; end; |
Re: Mausklick ausführen, ohne Mauszeigerbewegung.
Aloa,
hatte gerade nen kleinen Schriftfehler im TForm bei mir gefunden, hab mich da wohl irgendwie/irgwann vertippt. Also ok, jetzt tut sich was, allerdings bewegt sich der Cursor nach ganz unten rechts. @ omata Das hatte ich nun nach der TForm Berichtigung und einer kleinen Änderung auch genau so, das Ergebnis ist allerdings ein Dauerklick auf dem Button mit dem ich es ausführe (Button1). Edit: **nachdem ich ein offenes D3D Fenster beiseite geschoben habe ist der Cursor nun doch weggerutscht, **halt auf die Koordinate, was mich aber nun eigentlich wieder ganz an den Anfang bringt, **der Cursor soll nicht bewegt werden. Edit2: **Gehen wir es mal anders an, im Grunde sind wir ja nun mit allem **genau dort wo ich schon war bevor ich den Thread erstellte. **Der Cursor wird auf die Koordinate bewegt, der Klick wird ausgeführt, und zurück zur Ausgangsposition. **Das geschieht bei mir zwar in 5 Millisekunden (ohne einem Sleep bleibt die Maus gedrückt) **aber dennoch bewegt sich der Cursor. **Was ich halt suche ist ein Klick auf einer Position ohne ganz und gar eine Cursorbewegung zu erwingen. **Ich nenne es jetzt mal einen Geisterklick. **Edit2²: ****Sagen wir, damit es sichtbar ist, dass auf der Position geklickt wurde, ****legt man dort halt nen Ordner hin, so das dieser nach der Aktion markiert ist. Mit freundlichem Gruß Lostriga |
Re: Mausklick ausführen, ohne Mauszeigerbewegung.
Delphi-Quellcode:
procedure MakeMouseClick(AP: TPoint);
begin Mouse_Event(MOUSEEVENTF_LEFTDOWN or MOUSEEVENTF_ABSOLUTE, AP.x, AP.y, 0, 0); Mouse_Event(MOUSEEVENTF_LEFTUP or MOUSEEVENTF_ABSOLUTE, AP.x, AP.y, 0, 0); end; |
Re: Mausklick ausführen, ohne Mauszeigerbewegung.
Aloa ihr´s,
mal eine kleine Zusammenfassung womit ich nicht auf das gewünschte Ergebnis komme. Eine Blitzschnelle Bewegung der Maus: Zielpunkt -> Klick -> Ausgangspunkt, leider ist das nicht der gewünschte Effekt.
Delphi-Quellcode:
Das gleiche wie eben nur halt in einer Procedure zusammen gefasst.
procedure TForm1.MakeMouseClick(AP: TPoint);
var P:TPoint; begin if GetCursorPos(P) then begin SetCursorPos(AP.X, AP.Y); Mouse_Event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0); Mouse_Event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0); SetCursorPos(P.X, P.Y); end; end; procedure TForm1.Button1Click(Sender: TObject); var P:TPoint; begin P.X:=500; P.Y:=500; MakeMouseClick(P); end;
Delphi-Quellcode:
Dieses zeigt bei mir keinen Effekt, die X und Y Koordinaten haben anscheinend keinen Einfluss.
procedure TForm1.Button1Click(Sender: TObject);
var P:TPoint; X, Y:integer; begin X:=1240; Y:=800; if GetCursorPos(P) then begin SetCursorPos(X, Y); Mouse_Event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0); Mouse_Event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0); SetCursorPos(X, Y); end; end;
Delphi-Quellcode:
Habe auch nach längerem, weiterem Stöbern nicht´s gefunden, :glaskugel: es geht anscheinend nicht. :cry:
procedure MakeMouseClick(AP: TPoint);
begin Mouse_Event(MOUSEEVENTF_LEFTDOWN or MOUSEEVENTF_ABSOLUTE, AP.x, AP.y, 0, 0); Mouse_Event(MOUSEEVENTF_LEFTUP or MOUSEEVENTF_ABSOLUTE, AP.x, AP.y, 0, 0); end; procedure TForm1.Button1Click(Sender: TObject); var P:TPoint; begin P.X:=500; P.Y:=500; MakeMouseClick(P); end; Mit freundlichem Gruß Lostriga |
Re: Mausklick ausführen, ohne Mauszeigerbewegung.
Sind das absolute oder relative Koordinaten? Wenn auf Punkt 500,500 Deines Forms geklickt werden soll, musst Du diese erst umrechnen (ClientToScreen), sonst kann das nicht klappen.
|
Re: Mausklick ausführen, ohne Mauszeigerbewegung.
Aloa,
immer erscheine ich so spät. :feuerchen: @ DeddyH Angestrebt sind absolute Koordinaten, allerdings, um es etwas zu vertiefen, im Bereich eines Fenster Handle´s. Also einem Ordner/Programm/D3D Anwendung/.. jenachdem. Im Grunde soll es ja funktionieren wie mit SetCursorPos, bloß das ich versuche den puren Klick "zu positionieren", der Cursor soll sich keinen Pixel bewegen. Ich habe bisher auch im weiterem Durchforsten des Netzes nichts gefunden, deprimierender Weise bis jetzt auch in keiner anderen Programmiersprache. Mit freundlichem Gruß Lostriga |
Re: Mausklick ausführen, ohne Mauszeigerbewegung.
Dir ist aber schon klar, dass sobald sich die Ordnerstruktur ändert oder der Explorer anders eingerichtet ist, der Klick daneben geht?
Wenn du einen Ordner öffnen willst, solltest du eventuell besser ShellExecute verwenden. |
Re: Mausklick ausführen, ohne Mauszeigerbewegung.
Aloa,
ich möchte keinen Ordner öffnen oder so, ich suche einfach nur eine Möglichkeit SetCursorPos zu "eleminieren". Halt das es vollkommen ohne Cursorbewegung funktioniert, wie man das dann später nutzt, ist erst mal dahin gestellt. Mit freundlichem Gruß Lostriga |
Re: Mausklick ausführen, ohne Mauszeigerbewegung.
Delphi-Quellcode:
Dies ist nur eine leicht abgeänderte Form der hier zuvor geposteten Routine.
procedure TForm1.Button1Click(Sender: TObject);
var P:TPoint; X, Y:integer; begin X:=100; Y:=100; if GetCursorPos(P) then begin SetCursorPos(X, Y); Mouse_Event(MOUSEEVENTF_LEFTDOWN, X, Y, 0, 0); Mouse_Event(MOUSEEVENTF_LEFTUP, X, Y, 0, 0); SetCursorPos(P.X, P.Y); end; end; Bei mir funktionierts! MfG |
Re: Mausklick ausführen, ohne Mauszeigerbewegung.
Hi, wie wäre es hiermit (ungetestet!!)
Delphi-Quellcode:
GGf. statt "sendmessage" "postmessage" verwenden.
var h : hwnd;
p : TPoint; ClientPoint : TPoint; lparam : integer; begin h := WindowFromPoint(p); ClientPoint.x := p.x; ClientPoint.y := p.y; ScreenToClient(h,ClientPoint); lparam := ClientPoint.X + ClientPoint.Y shl 16; Sendmessage(h,WM_LBUTTOMDOWN,0,lparam); //Oder Sendmessage(h,WM_LBUTTOMDOWN,MK_LBUTTON,lparam); Sendmessage(h,WM_LBUTTUP,0,lparam); end; g lowF |
Re: Mausklick ausführen, ohne Mauszeigerbewegung.
@Lostriga:
Es ist schon eine unsaubere Methode, dass ganze über die Maus zumachen. Was auch immer du damit für ein Problem lösen willst - es gibt ganz sicher eine bessere Möglichkeit! |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:22 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz