[![Documentation](https://docs.rs/winput/badge.svg)](https://docs.rs/winput/)
[![Crates.io](https://img.shields.io/crates/v/winput.svg)](https://crates.io/crates/winput)
`winput` is a high-level interface to *Windows*' input system.
## Target
This crate aims to be low-level and straightforward enough to be used as a backend for other, more general crates of the genre. For this purpose, the "minimal" feature disables most of the stuff that is not really part of *Windows*' input system (things like [`Keylike`], for example, that are mostly there for convenience).
## Features
* `minimal`: This feature disables the [`Keylike`] structure as well as some shortcut functions. This feature has been made for people that want to use the straightforward api `winput` provides.
* `message_loop`: This feature enables the [`message_loop`] module that gives a way to globally retreive keyboard and mouse events from Windows' message system.
## What is left to do?
`winput` does not currently support any devices other than the mouse and the keyboard. I haven't really looked into how those work so if you know anything, feel free to submit an issue or a pull request!
## Examples
The [`Keylike`] structure allows you to synthesize keystrokes on objects that can be used as keys.
```rust
use winput::{Vk, Button};
// Synthesize keystrokes from a Virtual-Key Code
winput::press(Vk::Shift); // press the shift key
winput::send(Vk::A); // press then release the A key
winput::release(Vk::Shift); // release the shift key
// Synthesize keystrokes from characters
winput::send('F');
winput::send('O');
winput::send('O');
// Synthesize keystrokes from mouse buttons
winput::send(Button::Left);
// You can synthesize keystrokes for the characters of a string
winput::send_str("Hello, world!");
```
The [`Mouse`] structure can be used to manipulate the mouse.
```rust
use winput::Mouse;
// Retrieve the position of the mouse.
let (x, y) = Mouse::position();
// Set the mouse position
// ... in screen coordinates
Mouse::set_position(10, 10);
// ... in normalized absolute coordinates
Mouse::move_absolute(0.5, 0.5);
// ... relatively to the current cursor's position
Mouse::move_relative(100, 50);
// Rotate the mouse wheel (vertically)
Mouse::scroll(1.5);
// ... or horizontally
Mouse::scrollh(-1.5);
```
For more complicated input patterns, the [`Input`] structure can be used.
```rust
use winput::{Input, Vk, Action, MouseMotion};
// There is multiple ways to create an `Input`:
let inputs = [
// ... from a character
Input::from_char('a', Action::Press).unwrap(),
// ... from a Virtual-Key Code
Input::from_vk(Vk::A, Action::Release),
// ... from a mouse motion
Input::from_motion(MouseMotion::Relative { x: 100, y: 100 }),
// additional constructors are available
];
let number_of_inputs_inserted = winput::send_inputs(&inputs);
assert_eq!(number_of_inputs_inserted, 3);
```
With the `message_loop` feature (enabled by default), keyboard keystrokes and mouse inputs can be retreived.
```rust
use winput::{Vk, Action};
use winput::message_loop;
let receiver = message_loop::start().unwrap();
loop {
match receiver.next_event() {
message_loop::Event::Keyboard {
vk,
action: Action::Press,
..
} => {
if vk == Vk::Escape {
break;
} else {
println!("{:?} was pressed!", vk);
}
},
_ => (),
}
}
```
[`Keylike`]: https://docs.rs/winput/latest/winput/trait.Keylike.html
[`Input`]: https://docs.rs/winput/latest/winput/struct.Input.html
[`Mouse`]: https://docs.rs/winput/latest/winput/struct.Mouse.html
[`Handler`]: https://docs.rs/winput/latest/winput/message_loop/trait.Handler.html
[`message_loop`]: https://docs.rs/winput/latest/winput/message_loop/