WindowsInput 6.4.1

dotnet add package WindowsInput --version 6.4.1                
NuGet\Install-Package WindowsInput -Version 6.4.1                
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="WindowsInput" Version="6.4.1" />                
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add WindowsInput --version 6.4.1                
#r "nuget: WindowsInput, 6.4.1"                
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
// Install WindowsInput as a Cake Addin
#addin nuget:?package=WindowsInput&version=6.4.1

// Install WindowsInput as a Cake Tool
#tool nuget:?package=WindowsInput&version=6.4.1                

WindowsInput

Capture and Simulate Keyboard and Mouse Input

WindowsInput provides simple .NET (C#) classes to capture and simulate Keyboard and mouse input using Win32's SetWindowsHook and SendInput. All of the interop is done for you and there is a simple programming model for everything.

NuGet nuget

Install-Package WindowsInput

Prerequisites

  • Windows: .Net 4.6.1+

Samples

Run Notepad using the Keyboard...

public async Task RunNotepad() {
    await WindowsInput.Simulate.Events()
        //Hold Windows Key+R
        .ClickChord(KeyCode.LWin, KeyCode.R).Wait(1000)

        //Type "notepad"
        .Click("notepad").Wait(1000)

        //Press Enter
        .Click(KeyCode.Return).Wait(1000)

        //Type out our message.
        .Click("These are your orders if you choose to accept them...")
        .Click("This message will self destruct in 5 seconds.").Wait(5000)

        //Hold Alt+F4
        .ClickChord(KeyCode.Alt, KeyCode.F4).Wait(1000)

        //Press Tab then Enter.
        .Click(KeyCode.Tab, KeyCode.Return)

        //Do it!
        .Invoke()
        ;

Capture Keys from the Keyboard and disable the 'a' key:


public static void Main(){
    using (var Keyboard = WindowsInput.Capture.Global.KeyboardAsync()) {
        //Capture all events from the keyboard
        Keyboard.KeyEvent += Keyboard_KeyEvent;
        Console.ReadLine();
    }
}

private static void Keyboard_KeyEvent(object sender, EventSourceEventArgs<KeyboardEvent> e) {
    
    if(e.Data?.KeyDown?.Key == WindowsInput.Events.KeyCode.A || e.Data?.KeyUp?.Key == WindowsInput.Events.KeyCode.A) {
        e.Next_Hook_Enabled = false;
    }

}

Text Snippet Replacement

This example waits for someone to type 'aaa' (three A's in a row) and then replaces the text with 'Always Ask Albert'.

public static Task Do() {
    using (var Keyboard = WindowsInput.Capture.Global.KeyboardAsync()) {

        var Listener = new WindowsInput.EventSources.TextSequenceEventSource(Keyboard, new WindowsInput.Events.TextClick("aaa"));
        Listener.Triggered += (x, y) => Listener_Triggered(Keyboard, x, y); ;
        Listener.Enabled = true;

        Console.WriteLine("The keyboard is now listening for sequences.  Try typing 'aaa' in notepad.");

        Console.WriteLine("Press enter to quit...");
        Console.ReadLine();

    }
                
    return Task.CompletedTask;
}

private static async void Listener_Triggered(IKeyboardEventSource Keyboard, object sender, WindowsInput.EventSources.TextSequenceEventArgs e) {
    e.Input.Next_Hook_Enabled = false;

    var ToSend = WindowsInput.Simulate.Events();
    for (int i = 1; i < e.Sequence.Text.Length; i++) {
        ToSend.Click(WindowsInput.Events.KeyCode.Backspace);
    }

    ToSend.Click("Always ask albert!");

    //We suspend keyboard events because we don't want to accidently trigger a recursive loop if our
    //sending text actually had 'aaa' in it.
    using (Keyboard.Suspend()) {
        await ToSend.Invoke();
    }
}

Trigger text on a special key combination

public static Task Do() {
    using (var Keyboard = WindowsInput.Capture.Global.KeyboardAsync()) {

        var Listener = new WindowsInput.EventSources.KeyChordEventSource(Keyboard, new ChordClick(KeyCode.Control, KeyCode.Alt, KeyCode.Shift));
        Listener.Triggered += (x, y) => Listener_Triggered(Keyboard, x, y);
        Listener.Reset_On_Parent_EnabledChanged = false;
        Listener.Enabled = true;

        Console.WriteLine("The keyboard is now listening for chords.  Try typing 'CONTROL+ALT+SHIFT' in notepad.");

        Console.WriteLine("Press enter to quit...");
        Console.ReadLine();

    }

    return Task.CompletedTask;
}

private static async void Listener_Triggered(IKeyboardEventSource Keyboard, object sender, WindowsInput.EventSources.KeyChordEventArgs e) {
    var ToSend = WindowsInput.Simulate.Events();
            
    ToSend.Click("You pressed the magic keys.");

    using (Keyboard.Suspend()) {
        await ToSend.Invoke();
    }
}


Credits


This work is a tightly unified library that was built on the backs of the following giants:

Product Compatible and additional computed target framework versions.
.NET net5.0 was computed.  net5.0-windows was computed.  net6.0 was computed.  net6.0-android was computed.  net6.0-ios was computed.  net6.0-maccatalyst was computed.  net6.0-macos was computed.  net6.0-tvos was computed.  net6.0-windows was computed.  net6.0-windows7.0 is compatible.  net7.0 was computed.  net7.0-android was computed.  net7.0-ios was computed.  net7.0-maccatalyst was computed.  net7.0-macos was computed.  net7.0-tvos was computed.  net7.0-windows was computed.  net8.0 was computed.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed. 
.NET Core netcoreapp3.1 is compatible. 
.NET Framework net461 is compatible.  net462 was computed.  net463 was computed.  net47 was computed.  net471 was computed.  net472 was computed.  net48 was computed.  net481 was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.
  • .NETCoreApp 3.1

    • No dependencies.
  • .NETFramework 4.6.1

    • No dependencies.
  • net6.0-windows7.0

    • No dependencies.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories (10)

Showing the top 5 popular GitHub repositories that depend on WindowsInput:

Repository Stars
Davidobot/BetterJoy
Allows the Nintendo Switch Pro Controller, Joycons and SNES controller to be used with CEMU, Citra, Dolphin, Yuzu and as generic XInput
Valkirie/HandheldCompanion
ControllerService
xenolightning/AudioSwitcher_v1
Version 1 of Audio Switcher
C1rdec/Poe-Lurker
Ease your trading experience in Path of Exile.
liuke-wuhan/ZuAnBot
祖安助手:英雄联盟(League Of Legends)一键喷人,LOL游戏和客户端中可用。只为反击喷子!
Version Downloads Last updated
6.4.1 34,341 4/4/2023
6.4.0 21,381 2/4/2022
6.3.0 14,648 5/6/2021
6.2.1 2,537 3/17/2021
6.1.1 11,024 1/27/2020
6.1.0 1,516 12/31/2019
6.0.0 19,673 12/17/2019
0.2.0 76,908 11/27/2013

Added many performance and optimizations tweaks, added support .NET CORE