Advertisement
TLama

Untitled

Feb 1st, 2014
359
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 4.34 KB | None | 0 0
  1. unit Unit1;
  2.  
  3. interface
  4.  
  5. uses
  6.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  7.   Dialogs, StdCtrls, ExtCtrls, Math, Generics.Collections;
  8.  
  9. const
  10.   CursorMoveTimer = 1;
  11.  
  12. type
  13.   TCursorMover = class
  14.   private
  15.     FWndHandle: HWND;
  16.     FStartPos: TPoint;
  17.     FFinalPos: TPoint;
  18.     FStartTick: DWORD;
  19.     FFinalTick: DWORD;
  20.     FOnMovingEnd: TNotifyEvent;
  21.     procedure WndProc(var Msg: TMessage);
  22.   protected
  23.     procedure DoMovingEnd; virtual;
  24.     procedure DoTimerTick; virtual;
  25.   public
  26.     constructor Create; reintroduce;
  27.     destructor Destroy; override;
  28.     procedure CancelMoving;
  29.     procedure FinishMoving;
  30.     procedure MoveCursor(const FinalPos: TPoint); overload;
  31.     procedure MoveCursor(const FinalPos: TPoint; Duration: DWORD); overload;
  32.     procedure MoveCursor(const StartPos, FinalPos: TPoint; Duration: DWORD); overload;
  33.     property OnMovingEnd: TNotifyEvent read FOnMovingEnd write FOnMovingEnd;
  34.   end;
  35.  
  36. type
  37.   TForm1 = class(TForm)
  38.     Button1: TButton;
  39.     procedure FormCreate(Sender: TObject);
  40.     procedure Button1Click(Sender: TObject);
  41.     procedure FormDestroy(Sender: TObject);
  42.   private
  43.     FCurMover: TCursorMover;
  44.     FPosQueue: TQueue<TPoint>;
  45.     procedure CursorMovingEnd(Sender: TObject);
  46.   end;
  47.  
  48. var
  49.   Form1: TForm1;
  50.  
  51. implementation
  52.  
  53. {$R *.dfm}
  54.  
  55. { TCursorMover }
  56.  
  57. constructor TCursorMover.Create;
  58. begin
  59.   inherited;
  60.   FWndHandle := AllocateHWnd(WndProc);
  61. end;
  62.  
  63. destructor TCursorMover.Destroy;
  64. begin
  65.   KillTimer(FWndHandle, CursorMoveTimer);
  66.   DeallocateHWnd(FWndHandle);
  67.   inherited;
  68. end;
  69.  
  70. procedure TCursorMover.DoMovingEnd;
  71. begin
  72.   if Assigned(FOnMovingEnd) then
  73.     FOnMovingEnd(Self);
  74. end;
  75.  
  76. procedure TCursorMover.DoTimerTick;
  77. var
  78.   CurPos: TPoint;
  79.   CurTick: DWORD;
  80.   CurCoef: Double;
  81. begin
  82.   CurTick := GetTickCount;
  83.  
  84.   if CurTick >= FFinalTick then
  85.   begin
  86.     KillTimer(FWndHandle, CursorMoveTimer);
  87.     SetCursorPos(FFinalPos.X, FFinalPos.Y);
  88.     DoMovingEnd;
  89.   end
  90.   else
  91.   begin
  92.     CurCoef := (CurTick - FStartTick) / (FFinalTick - FStartTick);
  93.     CurPos.X := Round(-(FFinalPos.X - FStartPos.X) * CurCoef * (CurCoef - 2) + FStartPos.X);
  94.     CurPos.Y := Round(-(FFinalPos.Y - FStartPos.Y) * CurCoef * (CurCoef - 2) + FStartPos.Y);
  95.     SetCursorPos(CurPos.X, CurPos.Y);
  96.   end;
  97. end;
  98.  
  99. procedure TCursorMover.WndProc(var Msg: TMessage);
  100. begin
  101.   if Msg.Msg = WM_TIMER then
  102.   try
  103.     DoTimerTick;
  104.   except
  105.     Application.HandleException(Self);
  106.   end
  107.   else
  108.     Msg.Result := DefWindowProc(FWndHandle, Msg.Msg, Msg.WParam, Msg.LParam);
  109. end;
  110.  
  111. procedure TCursorMover.CancelMoving;
  112. begin
  113.   KillTimer(FWndHandle, CursorMoveTimer);
  114. end;
  115.  
  116. procedure TCursorMover.FinishMoving;
  117. begin
  118.   CancelMoving;
  119.   SetCursorPos(FFinalPos.X, FFinalPos.Y);
  120.   DoMovingEnd;
  121. end;
  122.  
  123. procedure TCursorMover.MoveCursor(const FinalPos: TPoint);
  124. begin
  125.   SetCursorPos(FinalPos.X, FinalPos.Y);
  126.   DoMovingEnd;
  127. end;
  128.  
  129. procedure TCursorMover.MoveCursor(const FinalPos: TPoint; Duration: DWORD);
  130. var
  131.   StartPos: TPoint;
  132. begin
  133.   GetCursorPos(StartPos);
  134.   MoveCursor(StartPos, FinalPos, Duration);
  135. end;
  136.  
  137. procedure TCursorMover.MoveCursor(const StartPos, FinalPos: TPoint; Duration: DWORD);
  138. var
  139.   CurTick: DWORD;
  140. begin
  141.   FStartPos := StartPos;
  142.   FFinalPos := FinalPos;
  143.   CurTick := GetTickCount;
  144.   FStartTick := CurTick;
  145.   FFinalTick := CurTick + Duration;
  146.   if SetTimer(FWndHandle, CursorMoveTimer, 15, nil) = 0 then
  147.     RaiseLastOSError;
  148. end;
  149.  
  150. { TForm1 }
  151.  
  152. procedure TForm1.FormCreate(Sender: TObject);
  153. begin
  154.   ReportMemoryLeaksOnShutdown := True;
  155.  
  156.   Randomize;
  157.   FPosQueue := TQueue<TPoint>.Create;
  158.   FCurMover := TCursorMover.Create;
  159.   FCurMover.OnMovingEnd := CursorMovingEnd;
  160. end;
  161.  
  162. procedure TForm1.FormDestroy(Sender: TObject);
  163. begin
  164.   FCurMover.Free;
  165.   FPosQueue.Free;
  166. end;
  167.  
  168. procedure TForm1.Button1Click(Sender: TObject);
  169. var
  170.   I: Integer;
  171.   ScreenSize: TSize;
  172.  
  173.   function GetRandomPos: TPoint;
  174.   begin
  175.     Result.X := Random(ScreenSize.cx);
  176.     Result.Y := Random(ScreenSize.cy);
  177.   end;
  178.  
  179. begin
  180.   ScreenSize.cx := Screen.Width;
  181.   ScreenSize.cy := Screen.Height;
  182.   for I := 1 to 15 do
  183.     FPosQueue.Enqueue(GetRandomPos);
  184.  
  185.   FCurMover.MoveCursor(FPosQueue.Dequeue);
  186. end;
  187.  
  188. procedure TForm1.CursorMovingEnd(Sender: TObject);
  189. begin
  190.   if FPosQueue.Count > 0 then
  191.     FCurMover.MoveCursor(FPosQueue.Dequeue, 1500);
  192. end;
  193.  
  194. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement