//! 取词:把「用户选中的文本」弄到手。 //! //! 两条路径,由 `selection.mode` 决定(默认 `"smart"`): //! - **UIA 直读**([`uia_capture`]):向目标进程的自动化提供者要当前选区。 //! 不模拟按键、不碰剪贴板,因此不受修饰键残留、UIPI、剪贴板占用影响。读不到就 //! 返回 None,自动退回下一条路径。 //! - **兼容路径**([`clipboard_capture`]):备份剪贴板 → 模拟 Ctrl+C → 读走 → 还原。 //! 覆盖最广(几乎所有支持复制的宿主都行),代价是短暂占用剪贴板。 //! //! 调用方不该关心用了哪条路径,只看 [`clipboard_capture::CaptureOutcome::source`] 即可。 //! //! 四条必须显式处理的现实约束(都是踩过才知道的): //! 0. **修饰键残留**:全局快捷键在按键**按下**瞬间触发,此时 Alt 仍被物理按住, //! 补发的 Ctrl+C 在目标应用看来是 `Alt+Ctrl+C` —— 没有任何应用把它当复制。 //! 这是「按了快捷键却取不到词」最主要的原因,见 //! [`clipboard_capture`] 里的 `neutralise_modifiers`。 //! 1. **剪贴板必须被屏蔽**:整个取词过程会动三次剪贴板,而监听线程是 250ms 轮询, //! 按序列号逐个记账存在竞态。见 [`crate::clipboard::suppress`]。 //! 2. **终端类应用不能取词**:Ctrl+C 在那里是中断信号。走进程黑名单,给出可行的替代做法。 //! 3. **提权窗口取不到词**:目标进程以管理员权限运行时,非提权进程的 `SendInput` //! 会被 UIPI 直接丢弃(不报错、无反馈)。因此必须区分「超时」与「剪贴板变了但没有文本」, //! 否则用户只会看到一句含糊的失败。 pub mod clipboard_capture; #[cfg(windows)] pub mod uia_capture; pub use clipboard_capture::{capture_selection, send_ctrl_v, CaptureRequest};