29 lines
1.9 KiB
Rust
29 lines
1.9 KiB
Rust
//! 取词:把「用户选中的文本」弄到手。
|
||
//!
|
||
//! 两条路径,由 `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};
|