HUMAN-LIKE MOUSE MOVEMENTS

hoby500 Messages postés 86 Date d'inscription mardi 25 février 2003 Statut Membre Dernière intervention 26 mai 2019 - 9 mars 2013 à 01:52
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 - 14 mars 2013 à 18:50
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/54990-human-like-mouse-movements

cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
14 mars 2013 à 18:50
@cirec:
oui, j'avais noté,il faudrait que les déplacements soient paramètrables afin de les faire coincider avec
ceux qui pourraient être utiles dans l'utilisation de certains jeux.
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
14 mars 2013 à 12:44
Voilà, le zip a été vidé de ses fichiers inutiles.

Sinon c'est plus qu'un simple code pour déplacer la souri,
il reproduit le déplacement humain, ce qui dans certain cas
peut être utile dans le développement de jeux ...

@++
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
11 mars 2013 à 13:04
ça serait bien également de mettre des commentaires
dans le code puisque ce source est destiné aux débutants
Personnellement, je fais et je utiliser ce module. Je ne serai heureux que si elle est fondée sur quelqu'un écrit quelque chose de plus parfait.
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
11 mars 2013 à 10:32
quelques optimisations :
function IsMouseButtonHeld(button: TClickType): boolean;
begin
Result := false; // à ajouter
case button of
mouse_Left: Result := (GetAsyncKeyState(VK_LBUTTON) <> 0);
mouse_Middle: Result := (GetAsyncKeyState(VK_MBUTTON) <> 0);
mouse_Right: Result := (GetAsyncKeyState(VK_RBUTTON) <> 0);
end;
end;

procedure ClickMouse(button: TClickType);
var
a, b, c: integer;
begin
{ Eventually, should be made to just use Integers }
a := 0; // à ajouter
GetMousePosition(b, c);
HoldMouse(b, c, Button);
repeat
Sleep(20 + Random(30));
a := a + 1;
until (a > 4);
GetMousePosition(b, c);
ReleaseMouse(b, c, Button);
Sleep(50 + Random(50));
end;

à supprimer lastdist := dist;

procedure SleepAndMoveMouse(Time: Integer);
var
Moving: Boolean;
mx, my: Integer;
x, y, xv, yv: Extended;
gx, gy: Extended;
T: Integer;
begin
xv := 0; // à ajouter
yv := 0; // idem

GetMousePosition(mx, my);
x := mx;
y := my;
if (Random(2) = 0) then
Moving := False
else
Moving := True;
gx := 130 + Random(500);
gy := 130 + Random(300);
T := GetTickCount;
repeat
Sleep(10);
if (Moving) then
begin
if (gx > x) then
xv := xv + 0.1
else
xv := xv - 0.1;
if (gy > y) then
yv := yv + 0.1
else
yv := yv - 0.1;
x := x + xv;
y := y + yv;
MoveMouse(Round(x), Round(y));
end;
if (Random(100) = 0) then
Moving := not Moving;
if (Random(30) = 0) then
begin
gx := 130 + Random(500);
gy := 130 + Random(300);
end;
until (Abs(GetTickCount - T) >= Time);
end;

procedure BrakeWindMouse(xs, ys, xe, ye, gravity, wind, minWait, maxWait, targetArea: extended);
var
veloX, veloY, windX, windY, veloMag, dist, randomDist {, lastDist}: extended;
lastX, lastY, MSP, W, maxStep, D, TDist: integer;
sqrt2, sqrt3, sqrt5, PDist: extended;
begin
veloX := 0;
veloY := 0;
windX := 0;
windY := 0;
d := 0; // à ajouter
MSP := MouseSpeed;
sqrt2 := sqrt(2);
sqrt3 := sqrt(3);
sqrt5 := sqrt(5);

TDist := Distance(Round(xs), Round(ys), Round(xe), Round(ye));
if (TDist < 1) then
TDist := 1;
repeat

dist := hypot(xs - xe, ys - ye);
wind := min(wind, dist);
if (dist < 1) then
dist := 1;
PDist := (dist / TDist);
if (PDist < 0.01) then
PDist := 0.01;

{
These constants seem smooth to me, but
feel free to modify these settings however
you wish.
}

if (PDist >= 0.15) then //15% (or higher) dist to destination
begin
D := Round(Round((Round(dist) * 0.3)) / 5);
if (D < 20) then
D := 20;
//D := RandomRange(15, 25); {Original}
end else if (PDist < 0.15) then
begin
if ((PDist <= 0.15) and (PDist >= 0.10)) then //10%-15%
D := RandomRange(8, 13)
else if (PDist < 0.10) then //< 10%
D := RandomRange(4, 7);
end;

if (D <= Round(dist)) then
maxStep := D
else
maxStep := Round(dist);

if dist >= targetArea then
begin
windX := windX / sqrt3 + (random(round(wind) * 2 + 1) - wind) / sqrt5;
windY := windY / sqrt3 + (random(round(wind) * 2 + 1) - wind) / sqrt5;
end else
begin
windX := windX / sqrt2;
windY := windY / sqrt2;
end;

veloX := veloX + windX;
veloY := veloY + windY;
veloX := veloX + gravity * (xe - xs) / dist;
veloY := veloY + gravity * (ye - ys) / dist;

if hypot(veloX, veloY) > maxStep then
begin
randomDist := maxStep / 2.0 + random(round(maxStep) div 2);
veloMag := sqrt(veloX * veloX + veloY * veloY);
veloX := (veloX / veloMag) * randomDist;
veloY := (veloY / veloMag) * randomDist;
end;

lastX := Round(xs);
lastY := Round(ys);
xs := xs + veloX;
ys := ys + veloY;

if (lastX <> Round(xs)) or (lastY <> Round(ys)) then
MoveMouse(Round(xs), Round(ys));

W := (Random(Round(100 / MSP))) * 6;
if (W < 5) then
W := 5;
W := Round(W * 1.2);
Sleep(W);
// lastdist := dist;
until (hypot(xs - xe, ys - ye) < 1);

if (Round(xe) <> Round(xs)) or (Round(ye) <> Round(ys)) then
MoveMouse(Round(xe), Round(ye));
MouseSpeed := MSP;
end;

Cela me paraît un peu compliqué pour un simple déplacement de souris
mais l'idée (qui n'est pas neuve..) est néanmoins intéressante et pourra servir de base
à de futures sources plus élaborées.
7/10
Bonjour! Et pourquoi est-ce?
hoby500 Messages postés 86 Date d'inscription mardi 25 février 2003 Statut Membre Dernière intervention 26 mai 2019
9 mars 2013 à 01:52
bonjour
vous ne pensez pas qu'il est utile de virer les fichiers backup *.~* de votre zip ?
Rejoignez-nous