You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Rust实现Chrome网页中三次Cmd+C全局快捷键的后台检测?

实现Chrome中连续三次Cmd+C触发Rust后台进程处理方案

由于crossterm依赖终端环境,无法实现全局按键监听,你需要使用系统级全局输入监听库来实现需求,以下是具体方案:

核心思路

  1. 采用全局按键监听库捕获系统级的按键事件,无需依赖终端。
  2. 维护一个按键记录器,追踪最近三次Cmd+C的触发时间,判断是否在设定的时间窗口内连续触发。
  3. 可选:添加当前活动窗口校验,仅当Chrome处于激活状态时触发逻辑。

推荐库与实现示例

选择rdev库(跨平台输入监听)

rdev可以捕获所有系统输入事件,适合自定义连续按键检测逻辑。

1. 添加依赖

在Cargo.toml中加入:

[dependencies]
rdev = "0.5"
chrono = "0.4"

2. 实现代码

use rdev::{listen, Event, EventType, Key, Modifier};
use chrono::Utc;
use std::sync::{Arc, Mutex};

// 存储最近三次Cmd+C的时间戳,用于判断连续触发
struct KeyPressTracker {
    timestamps: [Option<i64>; 3],
    // 自定义连续触发的时间阈值(毫秒)
    threshold: i64,
}

impl KeyPressTracker {
    fn new(threshold: i64) -> Self {
        Self {
            timestamps: [None, None, None],
            threshold,
        }
    }

    // 记录按键时间并检查是否满足连续三次触发条件
    fn check_trigger(&mut self) -> bool {
        let now = Utc::now().timestamp_millis();
        // 滚动时间戳,最新的放在首位
        self.timestamps[2] = self.timestamps[1];
        self.timestamps[1] = self.timestamps[0];
        self.timestamps[0] = Some(now);

        // 校验三个时间戳均存在且间隔小于阈值
        if let (Some(t1), Some(t2), Some(t3)) = (self.timestamps[0], self.timestamps[1], self.timestamps[2]) {
            (t1 - t2) < self.threshold && (t2 - t3) < self.threshold
        } else {
            false
        }
    }
}

fn main() {
    // 初始化追踪器,设置500ms的时间窗口
    let tracker = Arc::new(Mutex::new(KeyPressTracker::new(500)));

    let callback = move |event: Event| {
        match event.event_type {
            EventType::KeyPress(Key::KeyC) => {
                // 检查macOS的Cmd键(Meta)是否按下,Windows替换为Modifier::Super
                if rdev::is_modifier_pressed(Modifier::Meta) {
                    let mut track = tracker.lock().unwrap();
                    if track.check_trigger() {
                        println!("连续三次Cmd+C触发,执行自定义处理逻辑");
                        // 此处添加你的业务代码:读取剪贴板、调用API等
                    }
                }
            }
            _ => {}
        }
        true // 返回true保持监听
    };

    println!("后台进程已启动,等待连续三次Cmd+C触发...");
    if let Err(e) = listen(callback) {
        eprintln!("监听失败: {:?}", e);
    }
}

关键注意事项

  • 权限问题:
    • macOS:首次运行会请求输入监控权限,需在「系统设置 > 隐私与安全性 > 输入监控」中允许程序访问。
    • Windows:可能需要以管理员身份运行程序才能捕获全局按键。
  • 窗口校验(可选):
    如果需要仅在Chrome激活时触发,可添加当前活动窗口检测逻辑:
    • macOS:使用objc或core-foundation crate获取窗口标题,判断是否包含"Google Chrome"。
    • Windows:通过winapi crate调用GetForegroundWindow和GetWindowText获取窗口信息。
    • Linux:使用x11-dl crate查询当前活动窗口的类名。

内容的提问来源于stack exchange,提问作者Swithun

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 01:15:39