Human-like mouse movements

Soyez le premier à donner votre avis sur cette source.

Vue 4 270 fois - Téléchargée 803 fois

Description

Ce module a été écrit par moi sur Delphi XE, mais devrait compiler sans problèmes dans toute autre version de Delphi. Le module implémente la fonctionnalité de «mouvements de souris human-like», les mouvements de souris à savoir que l'homme. Le module sera utile pour ceux qui développent toutes sortes de robots pour les jeux de casino en ligne ou \ poker. Aucun des modules supplémentaires exception de Windows.

Codes Sources

A voir également

Ajouter un commentaire Commentaires
Messages postés
4720
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
31 juillet 2021
14
@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.
Messages postés
3826
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
10 mai 2021
46
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 ...

@++
Messages postés
4720
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
31 juillet 2021
14
ç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.
Messages postés
4720
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
31 juillet 2021
14
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
Afficher les 7 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.