【Tauri2】013——前端Window Event与创建Window

news2025/5/18 12:29:14

前言

【Tauri2】012——on_window_event函数-CSDN博客https://blog.csdn.net/qq_63401240/article/details/146909801?spm=1001.2014.3001.5501

前面介绍了on_window_event,这个在Builder中的方法,里面有许多事件·,比如Moved,Resized等之类的。

这篇就来简单地看看前端Window中的事件。

当然,事件可以自定义,以后慢慢说

参考

事件 | Tauri - Tauri 框架https://v2.tauri.org.cn/reference/javascript/api/namespaceevent/

正文

从官网中,可以发现有下面这些事件。

declare enum TauriEvent {
    WINDOW_RESIZED = "tauri://resize",
    WINDOW_MOVED = "tauri://move",
    WINDOW_CLOSE_REQUESTED = "tauri://close-requested",
    WINDOW_DESTROYED = "tauri://destroyed",
    WINDOW_FOCUS = "tauri://focus",
    WINDOW_BLUR = "tauri://blur",
    WINDOW_SCALE_FACTOR_CHANGED = "tauri://scale-change",
    WINDOW_THEME_CHANGED = "tauri://theme-changed",
    WINDOW_CREATED = "tauri://window-created",
    WEBVIEW_CREATED = "tauri://webview-created",
    DRAG_ENTER = "tauri://drag-enter",
    DRAG_OVER = "tauri://drag-over",
    DRAG_DROP = "tauri://drag-drop",
    DRAG_LEAVE = "tauri://drag-leave"
}

窗口事件

1、WINDOW_MOVED: "tauri://move" - 窗口移动时触发

2、WINDOW_RESIZED: "tauri://resize" - 窗口调整大小时触发

3、WINDOW_CLOSE_REQUESTED: "tauri://close-requested" - 窗口关闭请求时触发

4、WINDOW_DESTROYED: "tauri://destroyed" - 窗口销毁时触发

5、WINDOW_FOCUS: "tauri://focus" - 窗口获得焦点时触发

6、WINDOW_BLUR: "tauri://blur" - 窗口失去焦点时触发

7、WINDOW_SCALE_FACTOR_CHANGED: "tauri://scale-change" - 窗口缩放比例改变时触发

8、WINDOW_THEME_CHANGED: "tauri://theme-changed" - 窗口主题改变时触发

窗口生命周期事件

1、WINDOW_CREATED: "tauri://window-created" - 新窗口创建时触发

2、WEBVIEW_CREATED: "tauri://webview-created" - WebView 创建时触发

拖放事件

1、DRAG_ENTER: "tauri://drag-enter" - 拖拽进入窗口时触发

2、DRAG_OVER: "tauri://drag-over" - 拖拽在窗口上方时触发

3、DRAG_DROP: "tauri://drag-drop" - 拖拽释放时触发

4、DRAG_LEAVE: "tauri://drag-leave" - 拖拽离开窗口时触发

简单地使用一下

很明显,前端Window事件比on_window_event中的事件多。

在src目录下,新建一个Events目录,其中新建一个useEvent.ts文件,

文件中写一个useWindowEvent函数

比如说,使用移动,代码如下

import {getCurrentWindow} from "@tauri-apps/api/window";

export default function useWindowEvent() {
    let window = getCurrentWindow();
    window.onMoved((event)=>{
        console.log("窗口移动", event.payload);
    })

}

结果,在开发者工具中

还有使用listen,监听事件

import {getCurrentWindow} from "@tauri-apps/api/window";

export default function useWindowEvent() {
    let window = getCurrentWindow();
    window.listen("tauri://move", (event) => {
        console.log("Window moved", event.payload);
    })
}

结果如下 

大同小异,感觉差不多。

listen方法,以后还会用,这个是前端用来监听事件的,可以监听自定义事件,以后再说,还有once方法。

对于on,后面的事件,就只要下面几种,不能全部监听

 监听Window-created事件

在监听之前

可以现在后端打开开发者工具

WebviewWindow in tauri::webview - Rusthttps://docs.rs/tauri/latest/tauri/webview/struct.WebviewWindow.html#method.open_devtools即在setup中

   .setup(|app|{
            // 打开控制台
            #[cfg(debug_assertions)]
            {
                let window = app.get_webview_window("main").unwrap();
                window.open_devtools();

            }
            Ok(())
        })

需要在Cargo.toml中的feature设置devtools,即

tauri = { version = "2", features = ["devtools"] }

实际窗口创建后,可以自己打开。无所谓

要想监听Window-created,显而易见,需要创建Window

Tauri后端创建Window

前面创建menu,可以直接使用Menu,或者使用MenuBuilder,对于Window,差不多

参考

Window in tauri::window - Rusthttps://docs.rs/tauri/latest/tauri/window/struct.Window.html#method.builder虽然没有new,但是又builder方法

这和WindowBuilder,感觉没有什么区别

pub fn new<L: Into<String>>(manager: &'a M, label: L) -> Self

WindowBuilder in tauri::window - Rusthttps://docs.rs/tauri/latest/tauri/window/struct.WindowBuilder.html还有from_config方法,也可以,以后在说。

因此,笔者使用WindowBuilder创建,其中WindowBuilder的new方法

pub fn new<L: Into<String>>(manager: &'a M, label: L) -> Self

第一个manager,是引用M,还有生命周期'a

第二个label,是L,L的约束是Into<String>,传入一个&str,会自动转化成String。

总之,第一个参数传&app,第二个参数传&str。

在此之前,拆分一下后端的结构

创建command目录和mod.rs文件,通信函数写在里面,还可以再创建文件

名字任取。代码如下

use tauri::{AppHandle, WindowBuilder, command, Theme,Window};
#[command]
pub fn create_window(app: AppHandle, label: &str) {
    WindowBuilder::new(&app,label)
        .title(label)
        .build()
        .unwrap();
}

注册通信函数,关键代码

mod command;
.invoke_handler(tauri::generate_handler![
            command::create_window,
            command::change_theme
        ])

试试是否成功

在前端添加一个按钮,绑定事件。

    async function handleCreateWindow(){
        await invoke("create_window",{
            label:"world"
        });
    }

监听创建和销毁

    // 全局监听
    listen("tauri://window-created",(event) => {
            console.log("Window created", event);
    })
    // 全局监听
    listen("tauri://destroyed", (event) => {
        console.log("Window destroyed", event);
    })

 结果如下

前端创建窗口

很简单,

  constructor(label: WindowLabel, options?: WindowOptions);

第一个参数是label

第一个是其他选项,什么高度之类的。

import {Window} from "@tauri-apps/api/window";
export function createWindow() {
    let window=new Window('hello', {
        width: 400,
        height: 300,
        visible: true,
    })
    console.log("Window created", window);
}

调用函数,结果如下

 虽然创建了,但是,没有显示,需要调用show方法

    window.show()

但是,报错了

Uncaught (in promise) window.show not allowed.
Permissions associated with this command: window:allow-show

简单的说,权限不够。

权限修改

笔者本来想,单独写的,但感觉没必要。需要什么权限,就加什么权限,没什么好说的

在capability中的default.json中添加

  "windows": ["main","hello"],
permissions:[    
         .....
        "core:window:allow-show",
]

再次运行

export function createWindow() {
    let window=new Window('hello', {
        width: 400,
        height: 300,
        visible: true,
    })
    window.show()
    console.log("Window created", window);
}

但是结果还是报错了

 说什么 window not found,前面都说创建了,笔者看了看官网,发现没有什么用。

窗口 | Tauri - Tauri 框架https://v2.tauri.org.cn/reference/javascript/api/namespacewindow/#window

发现

但是,笔者查看了开发者工具中的网络,发现了这个东西

看看有些什么请求。

还是POST请求

看看负载

{
    event: "tauri://destroyed",
    target: {kind: "Any"},
    handler: 2498220777
}

 这里居然有个tauri://destroyed

其他请求,依然如此。

清除日志,再次点击。

发现了一个请求,还是POST

负载如下

 options: {width: 400, height: 300, visible: true, label: "hello"}

这给options不就是window的参数,

看看响应

"window.create not allowed. 
Permissions associated with this command: window:allow-create"

看到这个,笔者就明白了,权限问题。

因此,修改权限

  "permissions": [
     .....
    "core:window:allow-show",
    "core:window:allow-create"
  ]

最后一次运行

代码如下

export function createWindow() {
    let window=new Window('hello', {
        width: 400,
        height: 300,
        visible: true,
    })
    window.listen("tauri://window-created", (event) => {
        console.log("窗口创建成功", event);
        window.show()
    })
}

结果如下,完美

 看来在前端创建窗口,还需要权限。有点麻烦。

最后

官网的事件笔者也尝试了

这个created,也是可以的

window.listen("tauri://created", (event) => {
        console.log("窗口创建成功", event);
        window.show()
    })

想不到前端的这些事件,居然是发送请求。

笔者突然有个想法,能否模拟这个请求? 以后再来尝试,有点意思

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2328066.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

创建Linux虚拟环境并远程连接,finalshell自定义壁纸

安装VMware 这里不多赘述。 挂载Linux系统 1). 打开Vmware虚拟机&#xff0c;打开 编辑 -> 虚拟网络编辑器(N) 选择 NAT模式&#xff0c;然后选择右下角的 更改设置。 设置子网IP为 192.168.100.0&#xff0c;然后选择 应用 -> 确定。 解压 CentOS7-1.zip 到一个比较大…

基于pycharm的YOLOv11模型训练方法

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、前期准备1.1 软件环境配置1.2 训练集参考 二、训练步骤2.1 打开文件夹2.2 打开文件2.3 data.yaml最终代码 三、train.py四、最终结果五、detect.py六、 拓展…

034-QSharedMemory

QSharedMemory 以下为针对 QSharedMemory 的技术调研及实现方案&#xff0c;包含原理、优化策略、完整代码实现及流程图解&#xff1a; 一、QSharedMemory 核心原理 1.1 共享内存机制 共享内存流程图 &#xff08;注&#xff1a;此处应为共享内存IPC流程图&#xff0c;因文本…

在 Ubuntu 上离线安装 Prometheus 和 Grafana

在 Ubuntu 上离线安装 Prometheus 和 Grafana 的步骤如下&#xff1a; 一.安装验证 二.安装步骤 1.准备离线安装包 在一台可以访问互联网的机器上下载 Prometheus 和 Grafana 的二进制文件。 Prometheus 下载地址&#xff1a;Prometheus 官方下载页面Grafana 下载地址&#…

Ansible:playbook的高级用法

文章目录 1. handlers与notify2. tags组件3. playbook中使用变量3.1使用 setup 模块中变量3.2在playbook 命令行中定义变量3.3在playbook文件中定义变量3.4使用变量文件3.5主机清单文件中定义变量主机变量组&#xff08;公共&#xff09;变量 1. handlers与notify Handlers&am…

【C++进阶九】继承和虚继承

【C进阶九】继承和虚继承 1.什么是继承2.继承关系2.1protected和private的区别2.2通过父类的函数去访问父类的private成员2.3默认继承 3.基类和派生类对象的赋值转换4.继承中的作用域5.子类中的默认成员函数6.继承与静态成员7. 菱形继承8.虚继承9.继承和组合 1.什么是继承 继承…

电子电气架构 --- 面向服务的体系架构

我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 周末洗了一个澡&#xff0c;换了一身衣服&#xff0c;出了门却不知道去哪儿&#xff0c;不知道去找谁&am…

基姆拉尔森计算公式

基姆拉尔森计算公式&#xff08;Zellers Congruence 的变体&#xff09;是一种快速根据公历日期计算星期几的数学公式。其核心思想是通过对年月日的数值进行特定变换和取模运算&#xff0c;直接得到星期几的结果。 公式定义 对于日期 年-月-日&#xff0c;公式如下&#xff1a…

5 分钟用满血 DeepSeek R1 搭建个人 AI 知识库(含本地部署)

最近很多朋友都在问&#xff1a;怎么本地部署 DeepSeek 搭建个人知识库。 老实说&#xff0c;如果你不是为了研究技术&#xff0c;或者确实需要保护涉密数据&#xff0c;我真不建议去折腾本地部署。 为什么呢&#xff1f; 目前 Ollama 从 1.5B 到 70B 都只是把 R1 的推理能力…

Python数据可视化-第6章-坐标轴的定制

环境 开发工具 VSCode库的版本 numpy1.26.4 matplotlib3.10.1 ipympl0.9.7教材 本书为《Python数据可视化》一书的配套内容&#xff0c;本章为第6章 坐标轴的定制 本章主要介绍了坐标轴的定制&#xff0c;包括向任意位置添加坐标轴、定制刻度、隐藏轴脊和移动轴脊。 参考 第…

18认识Qt坐标系

平面直角坐标系(笛卡尔坐标系) 数学上的坐标系 右手坐标系 计算机中的坐标系 左手坐标系 坐标系的原点(0,0) 就是屏幕的左上角 /窗口的左上角 给 Qt 的某个控件,设置位置,就需要指定坐标.对于这个控件来说, 坐标系原点就是相对于父窗口/控件的. QPushButton 的父元素/父控件/父…

动态循环表单+动态判断表单类型+动态判断表单是否必填方法

页面效果&#xff1a; 接口请求到的数据格式&#xff1a; list: [{demandType: "设备辅助功能要求",demandSettingList: [{id: "1907384788664963074",name: "测试表单",fieldType: 0,contentValue: "",vaildStatus: 0, // 0 非必填&a…

25.4.3学习总结【Java】

又是一道错题&#xff1a; 1. 班级活动https://www.lanqiao.cn/problems/17153/learning/?page1&first_category_id1&sortdifficulty&asc1&second_category_id3 问题描述 小明的老师准备组织一次班级活动。班上一共有 n 名 (n 为偶数) 同学&#xff0c;老师…

运维之 Centos7 防火墙(CentOS 7 Firewall for Operations and Maintenance)

运维之 Centos7 防火墙 1.介绍 Linux CentOS 7 防火墙/端口设置&#xff1a; 基础概念&#xff1a; 防火墙是一种网络安全设备&#xff0c;用于监控和控制网络流量&#xff0c;以保护计算机系统免受未经授权的访问和恶意攻击。Linux CentOS 7操作系统自带了一个名为iptables的…

开发一个小程序需要多久时间?小程序软件开发周期

开发一个小程序所需时间受多种因素影响&#xff0c;以下为你详细列举&#xff1a; 一、需求复杂度。若只是简单展示类小程序&#xff0c;如企业宣传、产品介绍&#xff0c;功能单一&#xff0c;大概 1 - 2 周可完成。若涉及复杂交互&#xff0c;像电商小程序&#xff0c;涵盖商…

【数据结构篇】算法征途:穿越时间复杂度与空间复杂度的迷雾森林

文章目录 【数据结构篇】算法征途&#xff1a;穿越时间复杂度与空间复杂度的迷雾森林 一、 什么是算法1. 算法的定义1.1 算法的五个特征1.2 好算法的特质 2. 时间复杂度3. 空间复杂度 【数据结构篇】算法征途&#xff1a;穿越时间复杂度与空间复杂度的迷雾森林 &#x1f4ac;欢…

新增帧能耗指标|UWA Gears V1.0.9

UWA Gears 是UWA最新发布的无SDK性能分析工具。针对移动平台&#xff0c;提供了实时监测和截帧分析功能&#xff0c;帮助您精准定位性能热点&#xff0c;提升应用的整体表现。 本次版本更新主要新增帧能耗指标&#xff0c;帮助大家对每一帧的能耗进行精准监控&#xff0c;快速…

蓝桥杯嵌入式16届———LCD模块

LCD有官方给我们提供的库&#xff0c;我们使用其非常简单&#xff0c;唯一要注意的就是LCD和LED的引脚冲突。 引脚状况 STM32CubeMX 端口配置 使能 比赛给的选手 资源数据包中有以下三个文件&#xff0c;&#xff08;除去led相关的&#xff09;&#xff0c;将他们复制到自己…

CMake在Windows环境下Visual Studio Code的使用

1&#xff0c;安装下载 地址&#xff1a;Visual Studio Code - Code Editing. Redefined 双击安装 选择安装路径 可勾选微软的AI工具 2&#xff0c;环境介绍 2.1 &#xff0c;界面介绍 2.2中文包的安装 下载中文简体 汉化后的界面 2.3 配置C/C环境 VSCode安装好之后&#xf…

注意力机制在大语言模型中的原理与实现总结

注意力机制在大语言模型中的原理与实现总结 1. 章节介绍 在大语言模型的学习中&#xff0c;理解注意力机制至关重要。本章节旨在深入剖析注意力机制的原理及其在大语言模型中的应用&#xff0c;为构建和优化大语言模型提供理论与实践基础。通过回顾神经网络基础及传统架构的局…