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.

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 releasepress, 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.

EXAMPLE
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 device

On AsyncDeviceSame calls, still synchronous

AsyncDevice queues these too, with no .await; only queries are async.

EXAMPLE
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.