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.
<PackageVersion Include="WindowsInput" Version="6.4.1" />
                    
Directory.Packages.props
<PackageReference Include="WindowsInput" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version 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.
#addin nuget:?package=WindowsInput&version=6.4.1
                    
Install WindowsInput as a Cake Addin
#tool nuget:?package=WindowsInput&version=6.4.1
                    
Install WindowsInput as a Cake Tool

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.  net9.0 was computed.  net9.0-android was computed.  net9.0-browser was computed.  net9.0-ios was computed.  net9.0-maccatalyst was computed.  net9.0-macos was computed.  net9.0-tvos was computed.  net9.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 (1)

Showing the top 1 NuGet packages that depend on WindowsInput:

Package Downloads
VolcanicArts.VRCOSC.SDK

VRCOSC's SDK for developing VRCOSC modules

GitHub repositories (10)

Showing the top 10 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
liuke-wuhan/ZuAnBot
祖安助手:英雄联盟(League Of Legends)一键喷人,LOL游戏和客户端中可用。只为反击喷子!
VolcanicArts/VRCOSC
Modular OSC program creator, toolkit, and router made for VRChat. Show your heartrate, time, hardware stats, speech to text, control Spotify, and more! Includes drag-and-drop prefabs for your avatar.
BruceQiu1996/NPhoenix
Base on Lcu api,support many functions.Let's go by read readme.md
FireCubeStudios/Clippy
Bring back Clippy on Windows 10/11!
xiyanxy/BetterJoy_CHS
提供任天堂系列手柄与Cemu(搭配Cemuhook)、Citra、Dolphin、Yuzu等模拟器以及系统范围通用的XInput(DS4)支持,汉化定制版本
Martenfur/TabletFriend
Toolbar builder for Windows tablets.
DiabloRun/DiabloInterface
Diablo 2 Interface for Streamers/Speedrunners
Version Downloads Last updated
6.4.1 46,068 4/4/2023
6.4.0 26,934 2/4/2022
6.3.0 15,888 5/6/2021
6.2.1 2,637 3/17/2021
6.1.1 11,251 1/27/2020
6.1.0 1,592 12/31/2019
6.0.0 20,179 12/17/2019
0.2.0 100,316 11/27/2013

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