Mouse and Keyboard

Simba contains several functions to manipulate the mouse and keyboard. Features range from clicking and moving the mouse to faking keypresses.

Types

A few variables are exported for working with the Simba mouse functions.

TClickType, which defines the click type.

const
    mouse_Right = 0
    mouse_Left = 1
    mouse_Middle = 2

TMousePress, which defines if the mouse button is to be down or up.

TMousePress = (mouse_Down, mouse_Up);

Keyboard functions often use Virtual Keys. See virtualkeys for a complete list.

Mouse Functions

Simba’s coordinate system is similar to most computer coordinate systems. Coordinate (0, 0) is the top-left part of your selected window (the desktop by default). To get to point (5, 0) we move five pixels to the right; to get to (5, 5) we move five pixels to the right, and five pixels down.

Recall that the first value is x, the second value is y: (x, y)

MoveMouse

procedure MoveMouse(x, y: integer);

MoveMouse moves the mouse pointer to the specified x and y coordinates.

The following example will move the mouse to position (10, 10); relative to the selected client. (To get to point (10, 10) visually, recall that (0, 0) is the top left part and to get to (10, 10) we move 10 pixels to the right, and ten pixels down.)

Program MouseMove;

begin
  MoveMouse(10, 10);
end.

GetMousePos

procedure GetMousePos(var x, y: integer);

GetMousePos returns the current position of the mouse in x and y.

The following example moves the mouse 1 pixel to the right, relative to its current position:

Program MouseMoveRelative;

var x, y: integer;

begin
  GetMousePos(x, y);
  MoveMouse(x + 1, y);
end.

HoldMouse

procedure HoldMouse(x, y: Integer; clickType: TClickType);

HoldMouse holds the given mouse button specified by clickType down at the specified (x, y) coordinate. If the mouse if not at the given (x, y) yet, the mouse position will be set to (x, y).

The following example holds the left mouse button and moves it one pixel to the right relative to its current position.

program HoldMouse;

var x, y: integer;

begin
  GetMousePos(x, y);
  HoldMouse(x, y, mouse_Left);
  MoveMouse(x + 1, y);
end.

ReleaseMouse

procedure ReleaseMouse(x, y: Integer; clickType: TClickType);

HoldMouse holds the given mouse button (clickType) down at the specified x, y coordinate. If the mouse if not at the given x, y yet, the mouse position will be set to x, y.

The following example holds the left mouse button and moves it one pixel to the right and releases it to simulate a drag and drop motion.

program HoldMouseRelative;

var x, y: integer;

begin
  GetMousePos(x, y);
  HoldMouse(x, y, mouse_Left);
  MoveMouse(x + 1, y);
  GetMousePos(x, y);
  ReleaseMouse(x, y, mouse_Left);
end.

ClickMouse

procedure ClickMouse(x, y: Integer; clickType: Integer):

ClickMouse performs a click with the given mouse button (clickType) at the specified (x, y) coordinate. This click equals an immediate click, with no wait between holding down and releasing the mouse button. To create a more human-like effect, use the HoldMouse and ReleaseMouse functions.

The following example clicks the right mouse button at a specified point.

program ClickMouse;

var x, y: integer;

begin
  ClickMouse(x, y, mouse_Right);
end.

Keyboard Functions

Keyboard functions are obviously used to manipulate the keyboard input. It can also be used to read states of specific keys.

KeyDown

procedure KeyDown(key: Word);

KeyDown sends a request to the Operating System to “fake” an event that causes the keyboard key to be “down”.

The following example holds down the “Enter” key. (Note that if you call KeyDown you must call key up afterwards to release the key.)

program KeyDown;

begin
  KeyDown(13);
end.

KeyUp

procedure KeyUp(key: Word);

KeyDown sends a request to the Operating System to “fake” an event that causes the key to be “up”.

The following example holds down the “Enter” key and release after pausing to simulate a human action.

program KeyDownRelative;

begin
  KeyDown(13);
  wait(RandomRange(50, 100));
  KeyUp(13);
end.

PressKey

procedure PressKey(key: Word);

PressKey sends a request to the Operating System to “fake” a key event.

The following example simulates pressing the “Enter” key.

program PressKey;

begin
  PressKey(13);
end.

IsKeyDown

function isKeyDown(key: Word): boolean;

Returns True if key is currently being held.

The following example says “Hello World” if the “F5” key is held down.

program PressKey;

begin
  while not(isKeyDown(116)) do
    Wait(50);
  writeln('Hello World');
end.

GetKeyCode

function GetKeyCode(c: char) : integer;

Returns the keycode of character c.

SendKeys

procedure SendKeys(const s: string; keywait, keymodwait: integer);

Type the contents of the string s. While typing, hold the keys for keywait. SendKeys should work with any keyboard layout on Windows.

Example:

SendKeys('Hello, World', 100, 30);

Note

If your goal is to randomly wait a small time per key, you should consider something like this:

s := 'Hello, World';
for i := 0 to length(s) do
begin
  SendKeys(s[i], 50+Random(51), 30+Random(30));
  Wait(20+Random(30));
end;

Keyboard Virtual Keys

  • UNKNOWN: 0
  • LBUTTON: 1
  • RBUTTON: 2
  • CANCEL: 3
  • MBUTTON: 4
  • XBUTTON1: 5
  • XBUTTON2: 6
  • BACK: 8
  • TAB: 9
  • CLEAR: 12
  • RETURN: 13
  • SHIFT: 16
  • CONTROL: 17
  • MENU: 18
  • PAUSE: 19
  • CAPITAL: 20
  • KANA: 21
  • HANGUL: 21
  • JUNJA: 23
  • FINAL: 24
  • HANJA: 25
  • KANJI: 25
  • ESCAPE: 27
  • CONVERT: 28
  • NONCONVERT: 29
  • ACCEPT: 30
  • MODECHANGE: 31
  • SPACE: 32
  • PRIOR: 33
  • NEXT: 34
  • END: 35
  • HOME: 36
  • LEFT: 37
  • UP: 38
  • RIGHT: 39
  • DOWN: 40
  • SELECT: 41
  • PRINT: 42
  • EXECUTE: 43
  • SNAPSHOT: 44
  • INSERT: 45
  • DELETE: 46
  • HELP: 47
  • 0: 30
  • 1: 31
  • 2: 32
  • 3: 33
  • 4: 34
  • 5: 35
  • 6: 36
  • 7: 37
  • 8: 38
  • 9: 39
  • A: 41
  • B: 42
  • C: 43
  • D: 44
  • E: 45
  • F: 46
  • G: 47
  • H: 48
  • I: 49
  • J: 4A
  • K: 4B
  • L: 4C
  • M: 4D
  • N: 4E
  • O: 4F
  • P: 50
  • Q: 51
  • R: 52
  • S: 53
  • T: 54
  • U: 55
  • V: 56
  • W: 57
  • X: 58
  • Y: 59
  • Z: 5A
  • LWIN: 5B
  • RWIN: 5C
  • APPS: 5D
  • SLEEP: 5F
  • NUMPAD0: 96
  • NUMPAD1: 97
  • NUMPAD2: 98
  • NUMPAD3: 99
  • NUMPAD4: 100
  • NUMPAD5: 101
  • NUMPAD6: 102
  • NUMPAD7: 103
  • NUMPAD8: 104
  • NUMPAD9: 105
  • MULTIPLY: 106
  • ADD: 107
  • SEPARATOR: 108
  • SUBTRACT: 109
  • DECIMAL: 110
  • DIVIDE: 111
  • F1: 112
  • F2: 113
  • F3: 114
  • F4: 115
  • F5: 116
  • F6: 117
  • F7: 118
  • F8: 119
  • F9: 120
  • F10: 121
  • F11: 122
  • F12: 123
  • F13: 124
  • F14: 125
  • F15: 126
  • F16: 127
  • F17: 128
  • F18: 129
  • F19: 130
  • F20: 131
  • F21: 132
  • F22: 133
  • F23: 134
  • F24: 135
  • NUMLOCK: 90
  • SCROLL: 91
  • LSHIFT: A0
  • RSHIFT: A1
  • LCONTROL: A2
  • RCONTROL: A3
  • LMENU: A4
  • RMENU: A5
  • BROWSER_BACK: A6
  • BROWSER_FORWARD: A7
  • BROWSER_REFRESH: A8
  • BROWSER_STOP: A9
  • BROWSER_SEARCH: AA
  • BROWSER_FAVORITES: AB
  • BROWSER_HOME: AC
  • VOLUME_MUTE: AD
  • VOLUME_DOWN: AE
  • VOLUME_UP: AF
  • MEDIA_NEXT_TRACK: B0
  • MEDIA_PREV_TRACK: B1
  • MEDIA_STOP: B2
  • MEDIA_PLAY_PAUSE: B3
  • LAUNCH_MAIL: B4
  • LAUNCH_MEDIA_SELECT: B5
  • LAUNCH_APP1: B6
  • LAUNCH_APP2: B7
  • OEM_1: BA
  • OEM_PLUS: BB
  • OEM_COMMA: BC
  • OEM_MINUS: BD
  • OEM_PERIOD: BE
  • OEM_2: BF
  • OEM_3: C0
  • OEM_4: DB
  • OEM_5: DC
  • OEM_6: DD
  • OEM_7: DE
  • OEM_8: DF
  • OEM_102: E2
  • PROCESSKEY: E7
  • ATTN: F6
  • CRSEL: F7
  • EXSEL: F8
  • EREOF: F9
  • PLAY: FA
  • ZOOM: FB
  • NONAME: FC
  • PA1: FD
  • OEM_CLEAR: FE
  • HIGHESTVALUE: FE
  • UNDEFINED: FF