如何在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
相关产品推荐
相关产品推荐

