Mouse ===== Methods to interact with the mouse. ------------ type EMouseDistribution ~~~~~~~~~~~~~~~~~~~~~~~ The available distributions used to generate a point in a box. .. code-block:: pascal EMouseDistribution = ( MOUSE_DISTRIBUTION_DEFAULT, // Use Mouse.Distribution MOUSE_DISTRIBUTION_RANDOM, // Completely random point MOUSE_DISTRIBUTION_GAUSS, // Weighted towards the center MOUSE_DISTRIBUTION_SKEWED, // Weighted torwards current mouse position MOUSE_DISTRIBUTION_ROWP // Weighted torwards current mouse position but more "rounded" compared to MOUSE_DISTRIBUTION_SKEWED ); ------------ type TMouse ~~~~~~~~~~~ .. code-block:: pascal TMouse = record(TSRLBaseRecord) Speed: Double; // Overall mouse speed (Default: 12) Gravity, Wind: Double; // Gravity & Wind for generating mouse path (Default: 9 & 5) Distribution: EMouseDistribution; // Default distribution to use (Default: MOUSE_DISTRIBUTION_ROWP) MissChance: Double; // Percentage chance to "Miss" the mouse (Default: 10) IdleInterval: Double; // Distance to travel before calling Mouse.Idle() (Default: 0) IdleProgress: Double; IdleGoal: Double; OnMoving: TMouseMovingEvent; // Callback while mouse is being moved OnTeleport: TMouseTeleportEvent; // Callback when mouse is teleported end; ------------ Mouse.Setup ~~~~~~~~~~~ .. code-block:: pascal procedure TMouse.Setup; Initializes mouse variables. .. note:: This is automatically called on the **Mouse** variable. ------------ Mouse.Teleport ~~~~~~~~~~~~~~ .. code-block:: pascal procedure TMouse.Teleport(X, Y: Int32); Teleport the mouse to the desired X,Y coordinates. Example ------- .. code-block:: pascal Mouse.Teleport(50, 50); ------------ Mouse.Teleport ~~~~~~~~~~~~~~ .. code-block:: pascal procedure TMouse.Teleport(P: TPoint); Teleport the mouse to the desired point. Example ------- .. code-block:: pascal Mouse.Teleport(50, 50); ------------ Mouse.Position ~~~~~~~~~~~~~~ .. code-block:: pascal function TMouse.Position: TPoint; Returns the mouse current position. Example ------- .. code-block:: pascal var P: TPoint; P := Mouse.Position(); WriteLn('X: ', P.X); WriteLn('Y: ', P.Y); ------------ Mouse.Hold ~~~~~~~~~~ .. code-block:: pascal procedure TMouse.Hold(Button: Int32); Holds the desired mouse button down. The button will continue to be held down until `Mouse.Release` is called. Available buttons: - MOUSE_LEFT - MOUSE_RIGHT - MOUSE_SCROLL - MOUSE_EXTRA_1 - MOUSE_EXTRA_2 Example ------- .. code-block:: pascal Mouse.Hold(MOUSE_LEFT); // The mouse is now holding down left click. ------------ Mouse.Release ~~~~~~~~~~~~~ .. code-block:: pascal procedure TMouse.Release(Button: Int32); Releases the desired mouse button which has been previously held. Available buttons: - MOUSE_LEFT - MOUSE_RIGHT - MOUSE_SCROLL - MOUSE_EXTRA_1 - MOUSE_EXTRA_2 Example ------- .. code-block:: pascal Mouse.Release(MOUSE_LEFT); // The mouse is no holding left click. ------------ Mouse.WindMouse ~~~~~~~~~~~~~~~ .. code-block:: pascal procedure TMouse.Release(Button: Int32); The internal algorithm used by **Mouse.Move** to move the mouse in a human'ish way. Credit: BenLand100 (https://github.com/BenLand100/SMART/blob/master/src/EventNazi.java#L201) ------------ Mouse.Idle ~~~~~~~~~~ .. code-block:: pascal procedure TMouse.Idle; When **IdleInterval** is reached this is called. Override to change behavior. - An **IdleInterval** of **1.0** equals to the distance between the top left and bottom right of the client. - Assuming the client dimensions are 500,500 the distance between (0,0) and (500,500) is ~700. With an **IdleInterval** of **2.0** this would automatically be called every time the mouse has travelled ~1400 pixels. ------------ Mouse.Move ~~~~~~~~~~ .. code-block:: pascal procedure TMouse.Move(Destination: TPoint); Moves the mouse to the desired point. Example ------- .. code-block:: pascal var P: TPoint; P.X := 50; P.Y := 50; Mouse.Move(P); // The mouse is now at 50,50 ------------ Mouse.Move ~~~~~~~~~~ .. code-block:: pascal procedure TMouse.Move(P: TPoint); Moves the mouse to the desired X,Y coordinate. Example ------- .. code-block:: pascal Mouse.Move(50, 50); // The mouse is now at 50,50 ------------ Mouse.Move ~~~~~~~~~~ .. code-block:: pascal procedure TMouse.Move(Center: TPoint; Radius: Int32; ForcedMove: Boolean = False); Moves the mouse to a random point in an circle defined by **Center** and **Radius**. - **ForcedMove** determines if the mouse should be moved if already inside the circle. By default this is **False**. Example ------- .. code-block:: pascal Mouse.Move([100, 100], 25); // The mouse is now randomly within 100,100 with a radius of 25. ------------ Mouse.Move ~~~~~~~~~~ .. code-block:: pascal procedure TMouse.Move(Box: TBox; ForcedMove: Boolean = False; Distribution: EMouseDistribution = MOUSE_DISTRIBUTION_DEFAULT); Moves the mouse to a random point in the box. - **ForcedMove** determines if the mouse should be moved if already in the box. By default this is **False** - **Distribution** determines the method to generate a random point. By default this uses **Mouse.Distribution** Example ------- .. code-block:: pascal var B: TBox; B.X1 := 100; B.Y1 := 100; B.X2 := 200; B.Y2 := 200; Mouse.Move(B); // The mouse is now randomly within 100,100,200,200 ------------ Mouse.Move ~~~~~~~~~~ .. code-block:: pascal procedure TMouse.Move(Circle: TCircle; ForcedMove: Boolean = False); Moves the mouse to a random point in an circle. - **ForcedMove** determines if the mouse should be moved if already in the circle. By default this is **False**. Example ------- .. code-block:: pascal var C: TCircle; C.X := 100; C.Y := 100; C.Radius := 25; Mouse.Move(C); // The mouse is now randomly within 100,100 with a radius of 25. ------------ Mouse.Move ~~~~~~~~~~ .. code-block:: pascal procedure TMouse.Move(Rect: TRectangle; ForcedMove: Boolean = False); Moves the mouse to a random point in an rectangle. - **ForcedMove** determines if the mouse should be moved if already in the rectangle. By default this is **False**. Example ------- .. code-block:: pascal var TPA: TPointArray; var R: TRectangle; R := TPA.MinAreaRect(); Mouse.Move(R); ------------ Mouse.Click ~~~~~~~~~~~ .. code-block:: pascal procedure TMouse.Click(Button: Int32); Clicks the mouse with the desired button at the current mouse position. Available buttons: - MOUSE_LEFT - MOUSE_RIGHT - MOUSE_SCROLL - MOUSE_EXTRA_1 - MOUSE_EXTRA_2 Example ------- .. code-block:: pascal Mouse.Click(MOUSE_LEFT); // Left click the current mouse position ------------ Mouse.Click ~~~~~~~~~~~ .. code-block:: pascal procedure TMouse.Click(X, Y: Int32; Button: Int32); Moves the mouse to to X,Y and clicks the desired button. Available buttons: - MOUSE_LEFT - MOUSE_RIGHT - MOUSE_SCROLL - MOUSE_EXTRA_1 - MOUSE_EXTRA_2 Example ------- .. code-block:: pascal Mouse.Click(50, 50, MOUSE_LEFT); // Left click at 50,50 ------------ Mouse.Click ~~~~~~~~~~~ .. code-block:: pascal procedure TMouse.Click(P: TPoint; Button: Int32); Moves the mouse to P.X,P.Y and click the desired button. Available buttons: - MOUSE_LEFT - MOUSE_RIGHT - MOUSE_SCROLL - MOUSE_EXTRA_1 - MOUSE_EXTRA_2 Example ------- .. code-block:: pascal var P: TPoint; P.X := 50; P.Y := 50; Mouse.Click(P, MOUSE_LEFT); // Left click at 50,50 ------------ Mouse.Click ~~~~~~~~~~~ .. code-block:: pascal TMouse.Click(Circle: TCircle; Button: Int32; ForcedMove: Boolean = False); Moves the mouse to a random point in an circle defined by **Center** and **Radius** and clicks the desired button. - **ForcedMove** determines if the mouse should be moved if already in the circle. By default this is **False**. Example ------- .. code-block:: pascal Mouse.Click([100, 100], 25, MOUSE_LEFT); // Left clicked somewhere nearby 100,100 with a radius of 25. ------------ Mouse.Click ~~~~~~~~~~~ .. code-block:: pascal procedure TMouse.Click(Box: TBox; Button: Int32; ForcedMove: Boolean = False; Distribution: EMouseDistribution = MOUSE_DISTRIBUTION_DEFAULT); Moves the mouse to a random point in the box and clicks the desired button. - **ForcedMove** determines if the mouse should be moved if already in the box. By default this is **False** - **Distribution** determines the method to generate a random point. By default this uses **Mouse.Distribution** Available buttons: - MOUSE_LEFT - MOUSE_RIGHT - MOUSE_SCROLL - MOUSE_EXTRA_1 - MOUSE_EXTRA_2 Example ------- .. code-block:: pascal var B: TBox; B.X1 := 100; B.Y1 := 100; B.X2 := 200; B.Y2 := 200; Mouse.Click(B, MOUSE_LEFT); // Left clicked somewhere within 100,100,200,200 ------------ Mouse.Click ~~~~~~~~~~~ .. code-block:: pascal TMouse.Click(Circle: TCircle; Button: Int32; ForcedMove: Boolean = False); Moves the mouse to a random point in an circle and clicks the desired button. - **ForcedMove** determines if the mouse should be moved if already in the circle. By default this is **False**. Example ------- .. code-block:: pascal var C: TCircle; C.X := 100; C.Y := 100; C.Radius := 25; Mouse.Click(C, MOUSE_LEFT); // Left clicked somewhere nearby 100,100 with a radius of 25. ------------ Mouse.Click ~~~~~~~~~~~ .. code-block:: pascal procedure TMouse.Click(Rect: TRectangle; Button: Int32; ForcedMove: Boolean = False); Moves the mouse to a random point in an rectangle then clicks the desired button. - **ForcedMove** determines if the mouse should be moved if already in the rectangle. By default this is **False**. Example ------- .. code-block:: pascal var TPA: TPointArray; var R: TRectangle; R := TPA.MinAreaRect(); Mouse.Click(R, MOUSE_LEFT); ------------ Mouse.Miss ~~~~~~~~~~ .. code-block:: pascal function TMouse.Miss(P: TPoint): TPoint; "Misses" the destination point **P**. Will stop somewhere along the path or overshoot. Returns the position the mouse was moved to. This could automatically be called depending on **Mouse.MissChance**. ------------ Mouse.DragTo ~~~~~~~~~~~~ .. code-block:: pascal procedure TMouse.DragTo(X, Y: Int32; Button: Int32 = MOUSE_LEFT) Holds the desired button and moves the mouse to X,Y coordinates. - **Button** by default is MOUSE_LEFT. Example ------- .. code-block:: pascal Mouse.DragTo(50, 50); // Moves the mouse to 50,50 while holding MOUSE_LEFT ------------ Mouse.DragTo ~~~~~~~~~~~~ .. code-block:: pascal procedure TMouse.DragTo(P: TPoint; Button: Int32 = MOUSE_LEFT) Holds the desired button and moves the mouse to `P` coordinates. - **Button** by default is MOUSE_LEFT. Example ------- .. code-block:: pascal var P: TPoint; P.X := 50; P.Y := 50; Mouse.DragTo(P); // Moves the mouse to 50,50 while holding MOUSE_LEFT ------------ Mouse.Scroll ~~~~~~~~~~~~ .. code-block:: pascal procedure TMouse.Scroll(Amount: Int32; Down: Boolean); Scrolls the mouse X amount of times at the current mouse position. Example ------- .. code-block:: pascal Mouse.Scroll(5, True); // Scroll 5 times down Mouse.Scroll(5, False); // Scroll 5 times up ------------ Mouse.Scroll ~~~~~~~~~~~~ .. code-block:: pascal procedure TMouse.Scroll(P: TPoint; Scrolls: Int32; Down: Boolean); Moves the mouse to desired position `P` then scrolls X amount of times. Example ------- .. code-block:: pascal var P: TPoint; P.X := 50; P.Y := 50; Mouse.Scroll(P, 5, True); // Scroll 5 times down at 50,50 Mouse.Scroll(P, 5, False); // Scroll 5 times up at 50,50 ------------ Mouse.Scroll ~~~~~~~~~~~~ .. code-block:: pascal procedure TMouse.Scroll(Box: TBox; Amount: Int32; Down: Boolean); Moves the mouse to a random point in the box then scrolls X amount of times. Example ------- .. code-block:: pascal var B: TBox; B.X1 := 100; B.Y1 := 100; B.X2 := 200; B.Y2 := 200; Mouse.Scroll(B, 5, True); // Scroll the mouse down 5 times somewhere within 100,100,200,200 Mouse.Scroll(B, 5, False); // Scroll the mouse up 5 times somewhere within 100,100,200,200 ------------ var Mouse ~~~~~~~~~ Global mouse variable. ------------