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.

.. code-block:: pascal

    const
        mouse_Right = 0
        mouse_Left = 1
        mouse_Middle = 2

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

.. code-block:: pascal

    TMousePress = (mouse_Down, mouse_Up);  

Keyboard functions often use Virtual Keys. See :ref:`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)*

..
    TODO: Picture?

MoveMouse
~~~~~~~~~

.. _scriptref-movemouse:

.. code-block:: pascal

    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.)

.. code-block:: pascal

    Program MouseMove;

    begin
      MoveMouse(10, 10);
    end.


.. _scriptref-getmousepos:

GetMousePos
~~~~~~~~~~~

.. code-block:: pascal

    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:

.. code-block:: pascal

    Program MouseMoveRelative;

    var x, y: integer;

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

.. _scriptref-holdmouse:

HoldMouse
~~~~~~~~~

.. code-block:: pascal

    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)*.

..
    TODO: Example

.. _scriptref-releasemouse:

ReleaseMouse
~~~~~~~~~~~~

.. code-block:: pascal

    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.

..
    TODO: Example

.. _scriptref-clickmouse:

ClickMouse
~~~~~~~~~~

.. code-block:: pascal

    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.

Keyboard Functions
------------------

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

.. _scriptref-keydown:

KeyDown
~~~~~~~

.. code-block:: pascal

    procedure KeyDown(key: Word);

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

..
    TODO: Example

.. _scriptref-keyup:

KeyUp
~~~~~

.. code-block:: pascal

    procedure KeyUp(key: Word);

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

..
    TODO: Example

.. _scriptref-virtualkeys:

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
