Files
Thing/src-tauri/src/translate/capture/mod.rs
T
2026-09-17 17:32:20 +08:00

29 lines
1.9 KiB
Rust
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
//! 取词:把「用户选中的文本」弄到手。
//!
//! 两条路径,由 `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};