Inject
Press and release any inputOne 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 usagefn 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.
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 keyPress and release
press, release, force_releasefn 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.
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 holdOn AsyncDevice
Same calls, still synchronousAsyncDevice queues these frames too, so no .await; only the query methods are async.
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.