tauri:关闭窗口后最小化到托盘

上一篇博客记录了一个最简单的tauri+vue3+vite案例,这篇博客来实现关闭窗口后最小化到托盘的功能,注意我这里使用的是tauri2.0,与tauri1.0的托盘实现区别很大。

1、创建托盘

在Cargo.toml文件的tauri配置里添加tray-icon.

在src-tauri的src下创建tray.rs文件,代码如下:

注意:

use tauri::{

menu::{Menu, MenuItem}, tray::TrayIconBuilder, AppHandle, Manager, Runtime

};这里面的Manager看似没用到,其实在app.get_webview_window的时候会用到,不能删除。

rust 复制代码
use tauri::{
    menu::{Menu, MenuItem}, tray::TrayIconBuilder, AppHandle, Manager, Runtime
};

pub fn create_tray<R: Runtime>(app: &AppHandle<R>) -> tauri::Result<()> {
    let toggle_visibility = MenuItem::with_id(app, "toggle", "显示/隐藏窗口", true, None::<&str>)?;
    let quit = MenuItem::with_id(app, "quit", "退出", true, None::<&str>)?;
    
    let menu = Menu::with_items(app, &[&toggle_visibility, &quit])?;
    
    let _tray = TrayIconBuilder::new()
        .icon(app.default_window_icon().unwrap().clone())
        .tooltip("tauri-vite-vue3")
        .menu(&menu)
        .on_menu_event(move |app, event| match event.id.as_ref() {
            "toggle" => {
                if let Some(window) = app.get_webview_window("main") {
                    if window.is_visible().unwrap() {
                        let _ = window.hide();
                    } else {
                        let _ = window.show();
                        let _ = window.set_focus();
                    }
                }
            }
            "quit" => {
                app.exit(0);
            }
            _ => {}
        })
        .build(app)?;

    Ok(())
}

右键托盘,有两个菜单:显示/隐藏窗口,退出。

tooltip是鼠标移到托盘上显示的内容。

2、引入托盘

在main.rs里引入tray.rs,并且创建托盘:

rust 复制代码
// Prevents additional console window on Windows in release, DO NOT REMOVE!!
#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")]

mod tray;

#[cfg_attr(mobile, tauri::mobile_entry_point)]
pub fn run() {
    tauri::Builder::default()
        .setup(|app| {
            // 创建系统托盘
            tray::create_tray(app.handle())?;
            Ok(())
        })
        .run(tauri::generate_context!())
        .expect("error while running tauri application");
}

fn main() {
    run();
}

3、监听窗口关闭事件

在App.vue里监听窗口关闭行为,并且emit给tauri来处理。

javascript 复制代码
<script setup>
import { getCurrentWindow } from '@tauri-apps/api/window';
import { emit } from '@tauri-apps/api/event';
import { onMounted } from "vue";


const appWindow = getCurrentWindow();


// 在组件挂载时添加事件监听
onMounted(() => {
  // 监听窗口关闭请求
  appWindow.onCloseRequested(async (event) => {
    // 阻止默认的关闭行为
    event.preventDefault();
    // 发送事件到后端处理
    await emit('close_requested');
  });

});

4、处理窗口关闭事件

由于后续我还要添加其他窗口处理,所以另外创建一个window_manager.rs,代码统一写在这里:

这里写了两个方法:窗口最大化;处理close_requested事件,隐藏窗口。

rust 复制代码
// src/window_manager.rs
use tauri::{AppHandle, Listener, Manager, Runtime};


/// 设置窗口关闭事件监听器
pub fn setup_close_listener<R: Runtime>(app: &AppHandle<R>) {
    let app_handle = app.clone();
    app.listen_any("close_requested", move |_event| {
        if let Some(window) = app_handle.get_webview_window("main") {
            let _ = window.hide();
        }
    });
}



/// 设置所有窗口相关功能
pub fn setup_window_features<R: Runtime>(app: &AppHandle<R>) {
    setup_close_listener(app);
}

5、引入窗口处理

跟步骤2创建托盘类似,也要在main.rs里引入window_manager。

一个简单的托盘案例就做好了。

相关推荐
To_OC3 小时前
写了三遍 Todo List,我终于搞懂了 React 父子组件到底怎么通信
前端·javascript·react.js
勇往直前plus4 小时前
Vue3(篇一) 核心概念——响应式模板语法与组件基础
前端·javascript·vue.js
咩咩啃树皮4 小时前
第43篇:Vue3计算属性(computed)完全精讲——缓存机制、依赖计算、业务最优解
前端·vue.js·缓存
用户938515635075 小时前
从零搭建 AI 日记助手:用 Milvus 向量数据库 + RAG 让机器读懂你的每一天
javascript·人工智能·全栈
徐小夕6 小时前
花了一周,3亿tokens,我开源了一款 Word 文档智能审查平台,文稿自动质检+可视化分析,告别低效人工审核
前端·算法·github
a1117767 小时前
坦克大战3D Three.js 3D (开源项目)
开发语言·javascript·3d
kyriewen8 小时前
别再乱用useEffect了——你写的10个里有8个不该存在
前端·javascript·react.js
Ivanqhz8 小时前
Rust &‘static str浅析
java·前端·javascript·rust
IT_陈寒8 小时前
SpringBoot这个分页坑,我踩了三天才爬出来
前端·人工智能·后端
颜酱8 小时前
05 | 召回前置准备:根据业务数据库生成各数据库(读取配置阶段)
前端·人工智能·后端