Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Mausbewegung(!) simulieren (https://www.delphipraxis.net/90823-mausbewegung-simulieren.html)

Florian H 24. Apr 2007 13:01


Mausbewegung(!) simulieren
 
Aloha,

ich möchte eine Mausbewegung simulieren... mir gehts jetzt aber nicht darum, mit SetCursorPos(x,y) ne möglichst flüssige Bewegung aus einzelschritten zu machen; genau genommen muss es nichtmal flüssig oder sonstwas sein.

Aber folgendes Problem stellt sich mir:
Setze ich die Mausposition mittels SetcursorPos auf einen Bereich innerhalb eines Flashapplets , so bekommt dieses Applet nicht mit, dass die Maus sich dort befindet -> klicke ich dann (bzw. simuliere ich einen Klick), erfolgt der Klick (je nach Programmierung natürlich, in meinem Fall aber wie folgt) dann an ganz anderer Stelle.

Irgendwie muss ich diesem Flashteil in meinem Browser also mitteilen, dass die Mausposition sich geändert hat.
Und afair haben Apletts in einem Browser [z.B. Fifo bei mir] ja kein Handle oder so, auf das man damit gut zugreifen könnte(??).


Liebe Grüße
flo

Schubi 24. Apr 2007 13:05

Re: Mausbewegung(!) simulieren
 
Delphi-Quellcode:
procedure MoveMouse (X,Y,Speed: Integer);
var
  wd, hh : integer;
  mm : TPoint;
begin
 if Speed < 1 then Speed := 1;
 wd := X;
 hh := Y;

 Repeat
   sleep(speed);
   Application.Processmessages;
   GetCursorPos(mm);
   with mm do
   begin
     If x > wd then
      dec(x)
     else
     If x < wd then
      inc(x);
     If y > hh then
      dec(y)
     else
     If y < hh then
      inc(y);
   end;
   SetCursorPos(mm.x,mm.y);
 until (GetAsyncKeystate(Vk_Return) <> 0) or
       (GetAsyncKeystate(Vk_Escape) <> 0) or
       (GetAsyncKeystate(Vk_Space ) <> 0) or
       ((mm.X=X) and (mm.Y=Y));
end;
Tut genau was du suchst, denke ich... :)

DGL-luke 24. Apr 2007 13:10

Re: Mausbewegung(!) simulieren
 
Hallo, ich nehme mal an, dass das nicht wirkt.

bin mir sicher, da gibts n paar windows messages, die da versendet werden. MSDN-Library durchsuchenCM_MOUSEENTER zum beispiel. die musst du dann an das flash-fenster senden.

Schubi 24. Apr 2007 13:17

Re: Mausbewegung(!) simulieren
 
Ich hab die Procedure so im Einsatz, ohne Probleme. Sogar Spiele fressen die Mausbewegungen!

Florian H 24. Apr 2007 13:29

Re: Mausbewegung(!) simulieren
 
hm ja, danke, ich werds probieren .. ist ist komisch irgendwie *kopfkratz*

Torpedo 24. Apr 2007 13:48

Re: Mausbewegung(!) simulieren
 
Zitat:

Zitat von Schubi
Delphi-Quellcode:
...
Tut genau was du suchst, denke ich... :)

Das sieht aber nicht sehr natürlich aus, weil sich der Cursor nicht in einer geraden Linie zum Ziel hinbewegt. Man sollte das ganze mit Vektoren machen.

Schubi 24. Apr 2007 13:53

Re: Mausbewegung(!) simulieren
 
Zitat:

Zitat von Torpedo
Zitat:

Zitat von Schubi
Delphi-Quellcode:
...
Tut genau was du suchst, denke ich... :)

Das sieht aber nicht sehr natürlich aus, weil sich der Cursor nicht in einer geraden Linie zum Ziel hinbewegt. Man sollte das ganze mit Vektoren machen.

Tu dir keinen Zwang an :P :mrgreen:

Oder war das eine Aufforderung an mich? :gruebel:

Natürlicher als ein bloßes SetCursorPos wirkt es allemal :-D

Torpedo 24. Apr 2007 13:56

Re: Mausbewegung(!) simulieren
 
Habs mal so gemacht. Ist allerdings in C, sollte aber ganz leicht übersetzt werden können ;)
Code:
void mouseto(int x, int y, int speed){
        POINT maus;
        GetCursorPos(&maus);
        double mx = maus.x;
        double my = maus.y;

        while(mx != x || my != y) {
                double nx = x-mx;
                double ny = y-my;
                double len = sqrt(nx*nx + ny*ny);
                if(len<=1){
                        mx=x;
                        my=y;
                } else {
                        nx/=(len*0.5);
                        ny/=(len*0.5);
                        mx+=nx;
                        my+=ny;
                }
                SetCursorPos(ceil(mx),ceil(my));
                Sleep(speed);
        }
}
Es wird also bei jedem Durchgang (da der Benutzer die Maus bewegt haben könnte) ein Vektor gezogen und die x- bzw. y-Geschwindigkeit berechnet.

Kann sein, dass an der Abfrage in while noch gerundet werden muss und bei "0.5" ein bisschen was geändert werden muss. Konnte es gerade nicht testen.

Schubi 24. Apr 2007 14:19

Re: Mausbewegung(!) simulieren
 
Delphi-Quellcode:
procedure MoveMouse (X,Y,Speed: Integer);
var
  Maus : TPoint;
  mx, my, nx, ny, len : double;
begin
  if Speed < 1 then Speed := 1;

  GetCursorPos(Maus);
  mx := maus.x;
  my := maus.y;

  While (mx<>x)OR(my<>y) Do begin
    nx := x-mx;
    ny := y-my;
    len := sqrt(nx*nx + ny*ny);

    if(len<=1)Then begin
      mx:=x;
      my:=y;
    end
    else begin
      nx := nx / (len*0.5);
      ny := ny / (len*0.5);
      mx := mx + nx;
      my := my + ny;
    end;
    SetCursorPos(Round(mx),Round(my));
    Sleep(Speed);
  end;
end;
Na gut, hier die Delphi-Version.
Ich steh mit Vektoren auf Kriegsfuß, deswegen hab ich jetzt einfach abgeschrieben *g*

MiKaEr 15. Apr 2012 16:05

AW: Mausbewegung(!) simulieren
 
wie schaffe ich es denn mit folgendem code den cursor über ein control zu platzieren?

Delphi-Quellcode:
procedure MoveMouse(X, Y, Speed: Integer);
var
 Maus: TPoint;
 mx, my, nx, ny, len: double;
begin
 if Speed < 1 then
  Speed := 1;

 GetCursorPos(Maus);
 mx := Maus.X;
 my := Maus.Y;

 while (mx <> X) or (my <> Y) do
  begin
   nx := X - mx;
   ny := Y - my;
   len := sqrt(nx * nx + ny * ny);

   if (len <= 1) then
    begin
     mx := X;
     my := Y;
    end
   else
    begin
     nx := nx / (len * 0.5);
     ny := ny / (len * 0.5);
     mx := mx + nx;
     my := my + ny;
    end;

   SetCursorPos(Round(mx), Round(my));
   Sleep(Speed);
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 MoveMouse(Button2.Left, Button2.Top, 10);
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:32 Uhr.
Seite 1 von 2  1 2      

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