Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Mausklick ausführen, ohne Mauszeigerbewegung. (https://www.delphipraxis.net/146006-mausklick-ausfuehren-ohne-mauszeigerbewegung.html)

Lostriga 12. Jan 2010 00:06


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

s.h.a.r.k 12. Jan 2010 00:11

Re: Mausklick ausführen, ohne Mauszeigerbewegung.
 
Du willst also nur an irgendeine bestimmte Stelle klicken und nicht auf einen Button der dergleichen?

omata 12. Jan 2010 00:16

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;

Lostriga 12. Jan 2010 00:31

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

omata 12. Jan 2010 00:34

Re: Mausklick ausführen, ohne Mauszeigerbewegung.
 
Ok...

Aufruf:
Delphi-Quellcode:
var P:TPoint;
begin
  P.X:=100;
  P.Y:=100;
  MakeMouseClick(P);
end;

Lostriga 12. Jan 2010 00:52

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

omata 12. Jan 2010 00:54

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:
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;
Edit: Du must doch irgendwo diese Routine Aufrufen wollen? Wo kommen die Koordinaten her, an denen du den Mausklick durchführen möchtest?

s.h.a.r.k 12. Jan 2010 01:01

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.

omata 12. Jan 2010 01:10

Re: Mausklick ausführen, ohne Mauszeigerbewegung.
 
MakeMouseClick ist doch eine eigene Methode.

s.h.a.r.k 12. Jan 2010 01:19

Re: Mausklick ausführen, ohne Mauszeigerbewegung.
 
Mein Kommentar war für Lostriga. Ich denke er hat noch nicht ganz verstanden, wo der Punkt herkommt.

Lostriga 12. Jan 2010 01:32

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

s.h.a.r.k 12. Jan 2010 01:37

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.

omata 12. Jan 2010 01:38

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;

Lostriga 12. Jan 2010 01:45

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

sx2008 12. Jan 2010 05:49

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;

Lostriga 12. Jan 2010 22:51

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:
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;
Das gleiche wie eben nur halt in einer Procedure zusammen gefasst.
Delphi-Quellcode:
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;
Dieses zeigt bei mir keinen Effekt, die X und Y Koordinaten haben anscheinend keinen Einfluss.
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;

procedure TForm1.Button1Click(Sender: TObject);
var
  P:TPoint;
begin
  P.X:=500;
  P.Y:=500;
  MakeMouseClick(P);
end;
Habe auch nach längerem, weiterem Stöbern nicht´s gefunden, :glaskugel: es geht anscheinend nicht. :cry:


Mit freundlichem Gruß

Lostriga

DeddyH 13. Jan 2010 09:04

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.

Lostriga 13. Jan 2010 23:58

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

Luckie 14. Jan 2010 00:46

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 Delphi-Referenz durchsuchenShellExecute verwenden.

Lostriga 14. Jan 2010 00:51

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

Aphton 23. Feb 2010 15:30

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, X, Y, 0, 0);
    Mouse_Event(MOUSEEVENTF_LEFTUP, X, Y, 0, 0);
    SetCursorPos(P.X, P.Y);
  end;
end;
Dies ist nur eine leicht abgeänderte Form der hier zuvor geposteten Routine.
Bei mir funktionierts!

MfG

lowF 23. Feb 2010 15:53

Re: Mausklick ausführen, ohne Mauszeigerbewegung.
 
Hi, wie wäre es hiermit (ungetestet!!)
Delphi-Quellcode:
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;
GGf. statt "sendmessage" "postmessage" verwenden.

g
lowF

implementation 23. Feb 2010 16:05

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