Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- unit Unit1;
- interface
- uses
- Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
- Dialogs, StdCtrls, ExtCtrls, Math, Generics.Collections;
- const
- CursorMoveTimer = 1;
- type
- TCursorMover = class
- private
- FWndHandle: HWND;
- FStartPos: TPoint;
- FFinalPos: TPoint;
- FStartTick: DWORD;
- FFinalTick: DWORD;
- FOnMovingEnd: TNotifyEvent;
- procedure WndProc(var Msg: TMessage);
- protected
- procedure DoMovingEnd; virtual;
- procedure DoTimerTick; virtual;
- public
- constructor Create; reintroduce;
- destructor Destroy; override;
- procedure CancelMoving;
- procedure FinishMoving;
- procedure MoveCursor(const FinalPos: TPoint); overload;
- procedure MoveCursor(const FinalPos: TPoint; Duration: DWORD); overload;
- procedure MoveCursor(const StartPos, FinalPos: TPoint; Duration: DWORD); overload;
- property OnMovingEnd: TNotifyEvent read FOnMovingEnd write FOnMovingEnd;
- end;
- type
- TForm1 = class(TForm)
- Button1: TButton;
- procedure FormCreate(Sender: TObject);
- procedure Button1Click(Sender: TObject);
- procedure FormDestroy(Sender: TObject);
- private
- FCurMover: TCursorMover;
- FPosQueue: TQueue<TPoint>;
- procedure CursorMovingEnd(Sender: TObject);
- end;
- var
- Form1: TForm1;
- implementation
- {$R *.dfm}
- { TCursorMover }
- constructor TCursorMover.Create;
- begin
- inherited;
- FWndHandle := AllocateHWnd(WndProc);
- end;
- destructor TCursorMover.Destroy;
- begin
- KillTimer(FWndHandle, CursorMoveTimer);
- DeallocateHWnd(FWndHandle);
- inherited;
- end;
- procedure TCursorMover.DoMovingEnd;
- begin
- if Assigned(FOnMovingEnd) then
- FOnMovingEnd(Self);
- end;
- procedure TCursorMover.DoTimerTick;
- var
- CurPos: TPoint;
- CurTick: DWORD;
- CurCoef: Double;
- begin
- CurTick := GetTickCount;
- if CurTick >= FFinalTick then
- begin
- KillTimer(FWndHandle, CursorMoveTimer);
- SetCursorPos(FFinalPos.X, FFinalPos.Y);
- DoMovingEnd;
- end
- else
- begin
- CurCoef := (CurTick - FStartTick) / (FFinalTick - FStartTick);
- CurPos.X := Round(-(FFinalPos.X - FStartPos.X) * CurCoef * (CurCoef - 2) + FStartPos.X);
- CurPos.Y := Round(-(FFinalPos.Y - FStartPos.Y) * CurCoef * (CurCoef - 2) + FStartPos.Y);
- SetCursorPos(CurPos.X, CurPos.Y);
- end;
- end;
- procedure TCursorMover.WndProc(var Msg: TMessage);
- begin
- if Msg.Msg = WM_TIMER then
- try
- DoTimerTick;
- except
- Application.HandleException(Self);
- end
- else
- Msg.Result := DefWindowProc(FWndHandle, Msg.Msg, Msg.WParam, Msg.LParam);
- end;
- procedure TCursorMover.CancelMoving;
- begin
- KillTimer(FWndHandle, CursorMoveTimer);
- end;
- procedure TCursorMover.FinishMoving;
- begin
- CancelMoving;
- SetCursorPos(FFinalPos.X, FFinalPos.Y);
- DoMovingEnd;
- end;
- procedure TCursorMover.MoveCursor(const FinalPos: TPoint);
- begin
- SetCursorPos(FinalPos.X, FinalPos.Y);
- DoMovingEnd;
- end;
- procedure TCursorMover.MoveCursor(const FinalPos: TPoint; Duration: DWORD);
- var
- StartPos: TPoint;
- begin
- GetCursorPos(StartPos);
- MoveCursor(StartPos, FinalPos, Duration);
- end;
- procedure TCursorMover.MoveCursor(const StartPos, FinalPos: TPoint; Duration: DWORD);
- var
- CurTick: DWORD;
- begin
- FStartPos := StartPos;
- FFinalPos := FinalPos;
- CurTick := GetTickCount;
- FStartTick := CurTick;
- FFinalTick := CurTick + Duration;
- if SetTimer(FWndHandle, CursorMoveTimer, 15, nil) = 0 then
- RaiseLastOSError;
- end;
- { TForm1 }
- procedure TForm1.FormCreate(Sender: TObject);
- begin
- ReportMemoryLeaksOnShutdown := True;
- Randomize;
- FPosQueue := TQueue<TPoint>.Create;
- FCurMover := TCursorMover.Create;
- FCurMover.OnMovingEnd := CursorMovingEnd;
- end;
- procedure TForm1.FormDestroy(Sender: TObject);
- begin
- FCurMover.Free;
- FPosQueue.Free;
- end;
- procedure TForm1.Button1Click(Sender: TObject);
- var
- I: Integer;
- ScreenSize: TSize;
- function GetRandomPos: TPoint;
- begin
- Result.X := Random(ScreenSize.cx);
- Result.Y := Random(ScreenSize.cy);
- end;
- begin
- ScreenSize.cx := Screen.Width;
- ScreenSize.cy := Screen.Height;
- for I := 1 to 15 do
- FPosQueue.Enqueue(GetRandomPos);
- FCurMover.MoveCursor(FPosQueue.Dequeue);
- end;
- procedure TForm1.CursorMovingEnd(Sender: TObject);
- begin
- if FPosQueue.Count > 0 then
- FCurMover.MoveCursor(FPosQueue.Dequeue, 1500);
- end;
- end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement