Inject
inject drives every momentary input and takes any Usage (button, key, or media). press, release, and force_release wrap it. Each call queues one fire-and-forget INJECT frame.
injectPress or release any usage
fn inject(&self, usage: impl Into<Usage>, action: Action) -> Result<()>
Fire-and-forget
usage is any Usage; Button, Key, and MediaKey all convert into one. action is the Action tri-state: press, soft-release, or force-release.
A usage the cloned device can't report is a no-op. A click or chord is 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_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
Wrappers over inject, generic over any Usage. press holds the usage down. release clears the box's press or force; a hold on the real device stays down. force_release forces the usage up, even over a hold on the real device.
use medius::{Button, Key};
device.press(Button::LEFT)?; // held down
device.release(Button::LEFT)?; // box press cleared; a hold on the real device stays
device.force_release(Key::LEFT_GUI)?; // forced up over a hold on the real deviceOn AsyncDevice Same calls, still synchronous
AsyncDevice queues these too, with no .await; only queries are async.
use medius::{Button, Key};
// async_device: medius::AsyncDevice
async_device.press(Button::LEFT)?; // no .await; queues the frame
async_device.press(Key::ESCAPE)?;Build an AsyncDevice with cargo add medius --features async and AsyncDevice::open or Device::into_async.