Medius - Rust LibraryInject

Inject

Press and release any input

One field-generic verb drives every momentary input. inject takes any Usage (a button, key, or media usage); press, release, and force_release are convenience wrappers. Each call queues one fire-and-forget INJECT frame.

inject

Press or release any usage
fn inject(&self, usage: impl Into<Usage>, action: Action) -> Result<()>

Fire-and-forget

usage is any Usage: a Button, a Key, and a MediaKey all convert into one, so one verb drives every input class. action is the shared Action tri-state: press, soft-release, or force-release.

A usage the cloned device can't report is a no-op, and there's no firmware click or chord (compose a press then a client-timed release). reset releases every override.

EXAMPLE
use medius::{Button, Key, MediaKey, Action};

device.inject(Button::Left, Action::Press)?;        // mouse button
device.inject(Key::LEFT_SHIFT, Action::Press)?;     // keyboard key
device.inject(MediaKey::VOLUME_UP, Action::Press)?; // media key

Press and release

press, release, force_release
fn press(&self, usage: impl Into<Usage>) -> Result<()>
fn release(&self, usage: impl Into<Usage>) -> Result<()>
fn force_release(&self, usage: impl Into<Usage>) -> Result<()>

Fire-and-forget

The convenience wrappers over inject, generic over any Usage. press holds it down, release clears the box's press or force while a physical hold stays down, and force_release forces it up over a physical press.

EXAMPLE
use medius::{Button, Key};

device.press(Button::Left)?;          // held down
device.release(Button::Left)?;        // your press cleared; a physical hold survives
device.force_release(Key::LEFT_GUI)?; // forced up even under a physical hold

On AsyncDevice

Same calls, still synchronous

AsyncDevice queues these frames too, so no .await; only the query methods are async.

EXAMPLE
use medius::{Button, Key};

// async_device: medius::AsyncDevice
async_device.press(Button::Left)?;   // no .await, it just queues the frame
async_device.press(Key::ESCAPE)?;

Build an AsyncDevice with cargo add medius --features async and AsyncDevice::open or Device::into_async.