3 votes

SetCursorPos fonctionne mal ?

Je voulais écrire une procédure dans Delphi pour simuler le déplacement d'un pointeur de souris avec une vitesse spécifique (similaire à la fonction MouseMove d'AutoIT). Soit mon code est erroné, soit SetCursorPos fonctionne mal après avoir été appelé trop de fois. Voici la fonction que j'ai :

procedure MoveMouse ( X, Y, Speed : Integer);
var
  P     : TPoint;
  NewX  : Integer;
  NewY  : Integer;
begin
  if X < 0 then exit;
  if Y < 0 then exit;
  if X > Screen.Height then exit;
  if Y > Screen.Width then Exit;
  repeat
    GetCursorPos(P);
    NewX := P.X;
    NewY := P.Y;
    if P.X <> X then begin
      if P.X > X then begin
        NewX := P.X - 1;
      end else begin
        NewX := P.X + 1;
      end;
    end;
    if P.Y <> Y then begin
      if P.Y > Y then begin
        NewY := P.Y - 1;
      end else begin
        NewY := P.Y + 1;
      end;
    end;
    sleep (Speed);
    SetCursorPos(NewX, NewY);
  until (P.X = X) and (P.Y = Y);
end;

Je l'utilise comme ça :

procedure TForm1.btn1Click(Sender: TObject);
var
  X : Integer;
  Y : Integer;
begin
  for X := 0 to Screen.Width do begin
    for Y := 0 to Screen.Height do begin
      MouseClick (X, Y, 1);
    end;
  end;
end;

Pour une raison quelconque, le pointeur de la souris reste bloqué à un certain point X et revient ensuite à 0,0, mais pourquoi ?

6voto

RRUZ Points 98685

Votre code est bloqué, car dans la boucle de répétition, la condition

until (P.X = X) and (P.Y = Y);

n'est jamais satisfaite lorsque vous passez les valeurs X=0 et Y=Screen.Height, vous devez donc modifier votre boucle pour ne passer que des valeurs de coordonnées d'écran valides

  for X := 0 to Screen.Width-1 do
    for Y := 0 to Screen.Height-1 do
      MoveMouse (X, Y, 1); 

Vous pouvez également améliorer votre méthode en vérifiant le résultat de la méthode GetCursorPos y SetCursorPos fonctions.

procedure MoveMouse ( X, Y, Speed : Word);
var
  P     : TPoint;
  NewX  : Integer;
  NewY  : Integer;
begin
  if X > Screen.Width-1  then Exit;
  if Y > Screen.Height-1 then Exit;
  repeat
    if not GetCursorPos(P) then RaiseLastOSError;
    NewX := P.X;
    NewY := P.Y;
    if P.X <> X then
    begin
      if P.X > X then
        NewX := P.X - 1
      else
        NewX := P.X + 1;
    end;

    if P.Y <> Y then
    begin
      if P.Y > Y then
        NewY := P.Y - 1
      else
        NewY := P.Y + 1
    end;
    Sleep (Speed);
    if not SetCursorPos(NewX, NewY) then RaiseLastOSError;
  until (P.X = X) and (P.Y = Y);
end;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X