sendinput (user32)
Last changed: -113.208.118.82

.
Summary

The SendInput function synthesizes keystrokes, mouse motions, and button clicks to the currently active window

C# Signature:

        /// <summary>
        /// Synthesizes keystrokes, mouse motions, and button clicks.
        /// </summary>
        [DllImport("user32.dll")]
        internal static extern UINT SendInput(
        UINT nInputs,
        [MarshalAs(UnmanagedType.LPArray), In] INPUT[] pInputs,
        int cbSize);

VB.NET Signature:

<DllImport("user32.dll", SetLastError:=True)> Private Shared Function SendInput(ByVal cInputs As Integer, ByRef pInputs As MOUSEINPUT, ByVal cbSize As Integer) As Integer
End Function

VB Signature:

Private Declare Function SendInput Lib "user32.dll" (ByVal cInputs As Integer, ByRef pInputs As INPUT, ByVal cbSize As Integer) As Integer

C# User-Defined Types:

Notes:

look over here.

2 "UINT" should be replaced by "uint"

Tips & Tricks:

Please add some!

User-Defined Field Types:

INPUT

Sample Code:

        var pInputs = new[]
        {
        new StructLib.INPUT()
        {
            type = EnumLib.INPUT_TYPE.INPUT_KEYBOARD,
            ki = new StructLib.KEYBDINPUT()
                {
                wScan = EnumLib.ScanCodeShort.KEY_S,
                wVk = EnumLib.VirtualKeyShort.KEY_S
                }
        },
        new StructLib.INPUT()
        {
            type = EnumLib.INPUT_TYPE.INPUT_KEYBOARD,
            ki = new StructLib.KEYBDINPUT()
                {
                wScan = EnumLib.ScanCodeShort.KEY_S,
                wVk = EnumLib.VirtualKeyShort.KEY_S,
                dwFlags = EnumLib.KEYEVENTF.KEYUP
                }
        },
        new StructLib.INPUT()
        {
            type = EnumLib.INPUT_TYPE.INPUT_KEYBOARD,
            ki = new StructLib.KEYBDINPUT()
                {
                wScan = EnumLib.ScanCodeShort.KEY_S,
                wVk = EnumLib.VirtualKeyShort.KEY_S
                }
        },
        new StructLib.INPUT()
        {
            type = EnumLib.INPUT_TYPE.INPUT_KEYBOARD,
            ki = new StructLib.KEYBDINPUT()
                {
                wScan = EnumLib.ScanCodeShort.KEY_S,
                wVk = EnumLib.VirtualKeyShort.KEY_S,
                dwFlags = EnumLib.KEYEVENTF.KEYUP
                }
        },
        new StructLib.INPUT()
        {
            type = EnumLib.INPUT_TYPE.INPUT_KEYBOARD,
            ki = new StructLib.KEYBDINPUT()
                {
                wScan = EnumLib.ScanCodeShort.KEY_S,
                wVk = EnumLib.VirtualKeyShort.KEY_S
                }
        },
        new StructLib.INPUT()
        {
            type = EnumLib.INPUT_TYPE.INPUT_KEYBOARD,
            ki = new StructLib.KEYBDINPUT()
                {
                wScan = EnumLib.ScanCodeShort.KEY_S,
                wVk = EnumLib.VirtualKeyShort.KEY_S,
                dwFlags = EnumLib.KEYEVENTF.KEYUP
                }
        }
        };
        var hWindow = Api.user32.FindWindow("notepad", null);
        Api.user32.SetForegroundWindow(hWindow);
        Thread.Sleep(2500);
        Api.user32.SendInput(
        (uint)pInputs.Length, pInputs, StructLib.INPUT.Size);

#region powershell yes it WORKS!! begin

[testing.windows]::SetForegroundWindow( ( Get-Process notepad |? { $.id in ( get-wmiobject win32process -filter "name='notepad.exe'" |% { if ( $.getowner().user eq $env:username ) { $.processid } } ) } )[0].MainWindowHandle)

$_inputList = New-Object 'Collections.Generic.List[Testing.Windows3+INPUT]'

$inputList.Add( $( New-Object Testing.Windows3+INPUT Property { type = [Testing.Windows3+INPUTTYPE]::KEYBOARD ; U = $( New-Object Testing.Windows3+InputUnion -Property { ki = $( New-Object Testing.Windows3+KEYBDINPUT Property @{ wVk = [Testing.Windows3+VirtualKeyShort]::KEY_S } ) } ) } ) )

$inputList.Add( $( New-Object Testing.Windows3+INPUT Property { type = [Testing.Windows3+INPUTTYPE]::KEYBOARD ; U = $( New-Object Testing.Windows3+InputUnion -Property { ki = $( New-Object Testing.Windows3+KEYBDINPUT Property @{ wVk = [Testing.Windows3+VirtualKeyShort]::KEY_S ; dwFlags = $( [Testing.Windows3+KEYEVENTF]::KEYUP ) } ) } ) } ) )

$inputList.Add( $( New-Object Testing.Windows3+INPUT Property { type = [Testing.Windows3+INPUTTYPE]::KEYBOARD ; U = $( New-Object Testing.Windows3+InputUnion -Property { ki = $( New-Object Testing.Windows3+KEYBDINPUT Property @{ wVk = [Testing.Windows3+VirtualKeyShort]::MENU } ) } ) } ) )

$inputList.Add( $( New-Object Testing.Windows3+INPUT Property { type = [Testing.Windows3+INPUTTYPE]::KEYBOARD ; U = $( New-Object Testing.Windows3+InputUnion -Property { ki = $( New-Object Testing.Windows3+KEYBDINPUT Property @{ wVk = [Testing.Windows3+VirtualKeyShort]::KEY_E } ) } ) } ) )

$inputList.Add( $( New-Object Testing.Windows3+INPUT Property { type = [Testing.Windows3+INPUTTYPE]::KEYBOARD ; U = $( New-Object Testing.Windows3+InputUnion -Property { ki = $( New-Object Testing.Windows3+KEYBDINPUT Property @{ wVk = [Testing.Windows3+VirtualKeyShort]::MENU ; dwFlags = $( [Testing.Windows3+KEYEVENTF]::KEYUP ) } ) } ) } ) )

$inputList.Add( $( New-Object Testing.Windows3+INPUT Property { type = [Testing.Windows3+INPUTTYPE]::KEYBOARD ; U = $( New-Object Testing.Windows3+InputUnion -Property { ki = $( New-Object Testing.Windows3+KEYBDINPUT Property @{ wVk = [Testing.Windows3+VirtualKeyShort]::KEY_E ; dwFlags = $( [Testing.Windows3+KEYEVENTF]::KEYUP ) } ) } ) } ) )

$inputList.Add( $( New-Object Testing.Windows3+INPUT Property { type = [Testing.Windows3+INPUTTYPE]::KEYBOARD ; U = $( New-Object Testing.Windows3+InputUnion -Property { ki = $( New-Object Testing.Windows3+KEYBDINPUT Property @{ wVk = [Testing.Windows3+VirtualKeyShort]::CONTROL } ) } ) } ) )

$inputList.Add( $( New-Object Testing.Windows3+INPUT Property { type = [Testing.Windows3+INPUTTYPE]::KEYBOARD ; U = $( New-Object Testing.Windows3+InputUnion -Property { ki = $( New-Object Testing.Windows3+KEYBDINPUT Property @{ wVk = [Testing.Windows3+VirtualKeyShort]::KEY_F } ) } ) } ) )

$inputList.Add( $( New-Object Testing.Windows3+INPUT Property { type = [Testing.Windows3+INPUTTYPE]::KEYBOARD ; U = $( New-Object Testing.Windows3+InputUnion -Property { ki = $( New-Object Testing.Windows3+KEYBDINPUT Property @{ wVk = [Testing.Windows3+VirtualKeyShort]::CONTROL ; dwFlags = $( [Testing.Windows3+KEYEVENTF]::KEYUP ) } ) } ) } ) )

$inputList.Add( $( New-Object Testing.Windows3+INPUT Property { type = [Testing.Windows3+INPUTTYPE]::KEYBOARD ; U = $( New-Object Testing.Windows3+InputUnion -Property { ki = $( New-Object Testing.Windows3+KEYBDINPUT Property @{ wVk = [Testing.Windows3+VirtualKeyShort]::KEY_F ; dwFlags = $( [Testing.Windows3+KEYEVENTF]::KEYUP ) } ) } ) } ) )

$inputArray = $inputList.ToArray()

Start-Sleep 2 ; [Testing.Windows3]::SendInput($inputArray.count, $inputArray, [Runtime.InteropServices.marshal]::SizeOf($_inputArray[0]))

#endregion powershell yes it WORKS!! end

Documentation
SendInput on MSDN