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

如何在Tauri Mac端按下快捷键后获取Finder中选中的文件路径?

解决Tauri中获取Finder选中文件路径的问题

需求:在用户于Finder中选中文件并按下Cmd+Shift+R快捷键时获取文件路径。已成功注册该快捷键且可正常触发,但不清楚如何获取选中文件的路径。

现有Rust代码:

#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")]

use tauri::GlobalShortcutManager;

#[tauri::command]
fn greet(name: &str) -> String {
    format!("Hello ->, {}!", name)
}

fn main() {
    // setup the shortcut
    tauri::Builder::default()
        .setup(|app| {
            // #[cfg(target_os = "macos")]
            // app.set_activation_policy(tauri::ActivationPolicy::Accessory);

            let mut shortcut = app.global_shortcut_manager();
            shortcut
                .register("Cmd+Shift+R", move || {
                    println!("Cmd+Shift+R pressed");
                    
                })
                .unwrap_or_else(|err| println!("{:?}", err));

            Ok(())
        })
        .invoke_handler(tauri::generate_handler![greet])
        .build(tauri::generate_context!())
        .expect("error while building tauri application")
        .run(|_app_handle, event| match event {
            tauri::RunEvent::ExitRequested { api, .. } => {
                api.prevent_exit();
            }
            _ => {}
        })
}

更新:正在测试AppleScript命令tell application "Finder" to get selection

实现步骤

1. 利用AppleScript获取选中文件

在macOS上,通过系统的osascript工具执行AppleScript,就能直接获取Finder的选中文件列表,这是最直接的实现方式。

2. 修改代码实现功能

在快捷键触发的闭包中加入执行AppleScript并解析结果的逻辑,完整代码如下:

#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")]

use tauri::{GlobalShortcutManager, api::process::Command};

#[tauri::command]
fn greet(name: &str) -> String {
    format!("Hello ->, {}!", name)
}

fn main() {
    tauri::Builder::default()
        .setup(|app| {
            #[cfg(target_os = "macos")]
            app.set_activation_policy(tauri::ActivationPolicy::Accessory);

            let mut shortcut = app.global_shortcut_manager();
            shortcut
                .register("Cmd+Shift+R", move || {
                    println!("Cmd+Shift+R pressed");
                    
                    // 执行AppleScript获取Finder选中文件的完整路径
                    let output = Command::new("osascript")
                        .args(["-e", "tell application \"Finder\" to get selection as alias list"])
                        .output()
                        .expect("执行AppleScript失败");

                    if output.status.success() {
                        // 解析输出,每个路径以换行分隔
                        let paths_str = String::from_utf8_lossy(&output.stdout);
                        let paths: Vec<&str> = paths_str.trim().split('\n').collect();
                        
                        if paths.is_empty() {
                            println!("未选中任何文件");
                        } else {
                            println!("选中的文件路径:");
                            for path in paths {
                                println!("{}", path);
                            }
                        }
                    } else {
                        let err_msg = String::from_utf8_lossy(&output.stderr);
                        println!("获取选中文件失败:{}", err_msg);
                    }
                })
                .unwrap_or_else(|err| println!("注册快捷键失败:{:?}", err));

            Ok(())
        })
        .invoke_handler(tauri::generate_handler![greet])
        .build(tauri::generate_context!())
        .expect("构建Tauri应用失败")
        .run(|_app_handle, event| match event {
            tauri::RunEvent::ExitRequested { api, .. } => {
                api.prevent_exit();
            }
            _ => {}
        })
}

3. 代码说明

  • 启用ActivationPolicy::Accessory,让应用在后台运行,不显示主窗口
  • 通过Command调用osascript,执行的AppleScript语句会返回选中文件的完整路径列表
  • 解析命令输出,拆分出单个路径,同时处理无选中文件的异常情况

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 03:41:22