WindowsInput 6.4.1
dotnet add package WindowsInput --version 6.4.1
NuGet\Install-Package WindowsInput -Version 6.4.1
<PackageReference Include="WindowsInput" Version="6.4.1" />
paket add WindowsInput --version 6.4.1
#r "nuget: WindowsInput, 6.4.1"
// 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
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 | Versions 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. |
-
.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游戏和客户端中可用。只为反击喷子!
|
Added many performance and optimizations tweaks, added support .NET CORE