Function Reference


_WinAPI_SendInput

Synthesizes keystrokes, mouse motions, and button clicks

#include <WinAPISys.au3>
_WinAPI_SendInput ( $iType, $nInputs, $tInputArray )

Parameters

$iType The type of the entries of the $InputArray ($INPUT_MOUSE, $INPUT_KEYBOAARD or $INPUT_HARDWARE).
$nInputs The number of structures in the $tInputArray.
$tInputArray An array of $tag*INPUT structures. Each structure represents an event to be inserted into the keyboard or mouse input stream.

Return Value

Success: the number of events that it successfully inserted into the keyboard or mouse input stream.
Failure: Set @error and @extended
@error: 10 - wrong $iType
11 - wrong $tInputArray size.
12 - no event sent, the input was already blocked by another thread.
13 - not all events have been set. return is equal to the number of used Events.
@extended: _WinAPI_GetLastError().

Remarks

Each entry of the array are one of the $tagMOUSEINPUT , $tagKEYBDINPUT or $tagHARDWAREINPUT. The type of each entry will be forced to $iType.

The _WinAPI_SendInput function inserts the events in the INPUT structures serially into the keyboard or mouse input stream.
These events are not interspersed with other keyboard or mouse input events inserted either by the user (with the keyboard or mouse) or by calls to keybd_event, mouse_event, or other calls to SendInput.

See MSDN for complete explanation.

Related

$tagKEYBDINPUT, $tagMOUSEINPUT, $tagHARDWAREINPUT

See Also

Search SendInput in MSDN Library.

Example

Example 1

#include <MsgBoxConstants.au3>
#include <WinAPIError.au3>
#include <WinAPISys.au3>
#include <WinAPIvkeysConstants.au3>

Example()

Func Example()

    #cs ==========================================================
        https://www.autoitscript.com/forum/topic/210029-keypress-simulation-with-winapi-functions-directly/#comment-1518451

        Using the SendInput win32 API, this example sends a string
        of "a" to the last active notepad instance (if it exists).

        Note:
        If user press other keys while the string of "a" is sent,
        they are buffered and displayed AFTER the string of "a"

        This is a huge difference with the Send() function where
        the display would be intermingled when you send for ex.
        a string of 5.000 "a" with a single Send() instruction.

        The SendInput function works by injecting a series of simulated input events into a device's input stream.
        The effect is similar to calling the keybd_event or mouse_event function repeatedly, except that the system ensures that no other input events intermingle with the simulated events.
        When the call completes, the return value indicates the number of input events successfully played. If this value is zero, then input was blocked.
    #ce ==========================================================

    ; Line moved inside the function, or the script won't run with AutoIt 3.3.14.5 ("includes chain" changed from 3.3.14.5 to 3.3.16.1)

    Local $iNumberOfInputs = 500 * 2 ; => 1000 inputs (press/release) => 500 chars displayed
    If $iNumberOfInputs < 2 Or (($iNumberOfInputs / 2) <> Int($iNumberOfInputs / 2)) Then _
            Exit MsgBox($MB_ICONERROR, "$iNumberOfInputs", "It has to be an even number, greater or equal to 2")

    ;Create a struct to get size
    Local $tKeybdInput = DllStructCreate($tagKEYBDINPUT)

    ;Create an inputs array buffer
    Local $tInputArray = DllStructCreate(StringFormat("byte bytes[%i];", DllStructGetSize($tKeybdInput) * $iNumberOfInputs))

    For $i = 0 To $iNumberOfInputs - 3 Step 2

        ;Load input array[$i]
        $tKeybdInput = DllStructCreate($tagKEYBDINPUT, DllStructGetPtr($tInputArray) + ($i * DllStructGetSize($tKeybdInput)))
        $tKeybdInput.wVk = $VK_A

        ;Load input array[$i + 1]
        $tKeybdInput = DllStructCreate($tagKEYBDINPUT, DllStructGetPtr($tInputArray) + (($i + 1) * DllStructGetSize($tKeybdInput)))
        $tKeybdInput.wvk = $VK_A
        $tKeybdInput.dwFlags = $KEYEVENTF_KEYUP
    Next

    ;Load input array[$i]
    $tKeybdInput = DllStructCreate($tagKEYBDINPUT, DllStructGetPtr($tInputArray) + ($i * DllStructGetSize($tKeybdInput)))
    $tKeybdInput.wVk = $VK_RETURN

    ;Load input array[$i + 1]
    $tKeybdInput = DllStructCreate($tagKEYBDINPUT, DllStructGetPtr($tInputArray) + (($i + 1) * DllStructGetSize($tKeybdInput)))
    $tKeybdInput.wvk = $VK_RETURN
    $tKeybdInput.dwFlags = $KEYEVENTF_KEYUP

    ;Activate notepad window
    If Not WinActivate("[CLASS:Notepad]") Then
        Run("notepad.exe")
        WinWaitActive("[CLASS:Notepad]")
    EndIf

    ;Send input
    Local $nResult = _WinAPI_SendInput($INPUT_KEYBOARD, $iNumberOfInputs, $tInputArray)

    If $nResult = 0 Then
        MsgBox(0, "GetLastError", _WinAPI_GetLastErrorMessage())
    ElseIf $nResult <> $iNumberOfInputs Then
        MsgBox(0, "Warning", $nResult & " keyboard events returned (it should have been " & $iNumberOfInputs & ")")
    EndIf

EndFunc   ;==>Example

Example 2 : _WinAPI_SendInout() for $INPUT_MOUSE entry

#include <MsgBoxConstants.au3>
#include <WinAPIError.au3>
#include <WinAPISys.au3>
#include <WinAPIvkeysConstants.au3>

Example()

Func Example()
    #cs
        INPUT input;
        input.type = INPUT_MOUSE;
        input.mi.mouseData = 0;
        input.mi.dx = x * (65536 / GetSystemMetrics(SM_CXSCREEN)); //x being coord in pixels
        input.mi.dy =  y * (65536 / GetSystemMetrics(SM_CYSCREEN)); //y being coord in pixels
        input.mi.dwFlags = MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE;
        SendInput(1, &input, sizeof(input));
    #ce

    Local $iNumberOfInputs = 1
    Local $x = 100 ; coord in pixels
    Local $Y = 100 ; coord in pixels

    Local $tInputArray = DllStructCreate($tagMOUSEINPUT)
    $tInputArray.mouseData = 0
    $tInputArray.dx = $x * (65536 / _WinAPI_GetSystemMetrics($SM_CXSCREEN)) ; //x being coord in pixels
    $tInputArray.dy = $y * (65536 / _WinAPI_GetSystemMetrics($SM_CYSCREEN)) ; //y being coord in pixels
    $tInputArray.dwFlags = $MOUSEEVENTF_ABSOLUTE + $MOUSEEVENTF_MOVE
    Local $nResult = _WinAPI_SendInput($INPUT_MOUSE, $iNumberOfInputs, $tInputArray)

    If $nResult = 0 Then
        MsgBox(0, "GetLastError", _WinAPI_GetLastErrorMessage())
    ElseIf $nResult <> $iNumberOfInputs Then
        MsgBox(0, "Warning", $nResult & " mouse events returned (it should have been " & $iNumberOfInputs & ")")
    EndIf

EndFunc   ;==>Example