【Tauri2】013——前端Window Event与创建Window
前言
【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 - Rust
https://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 - Rust
https://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 - Rust
https://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()})
想不到前端的这些事件,居然是发送请求。
笔者突然有个想法,能否模拟这个请求? 以后再来尝试,有点意思

相关文章:
【Tauri2】013——前端Window Event与创建Window
前言 【Tauri2】012——on_window_event函数-CSDN博客https://blog.csdn.net/qq_63401240/article/details/146909801?spm1001.2014.3001.5501 前面介绍了on_window_event,这个在Builder中的方法,里面有许多事件,比如Moved,Res…...
创建Linux虚拟环境并远程连接,finalshell自定义壁纸
安装VMware 这里不多赘述。 挂载Linux系统 1). 打开Vmware虚拟机,打开 编辑 -> 虚拟网络编辑器(N) 选择 NAT模式,然后选择右下角的 更改设置。 设置子网IP为 192.168.100.0,然后选择 应用 -> 确定。 解压 CentOS7-1.zip 到一个比较大…...
DBAPI设置服务器开机自启动
在 /etc/systemd/system 目录下创建一个新的服务文件,例如 dbapi.service [Unit] Descriptiondbapi standalone Service Afternetwork.target[Service] ExecStart/your-path/dbapi-enterprise-4.2.2/bin/dbapi.sh start standalone Restartalways Userroot[Install…...
基于pycharm的YOLOv11模型训练方法
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、前期准备1.1 软件环境配置1.2 训练集参考 二、训练步骤2.1 打开文件夹2.2 打开文件2.3 data.yaml最终代码 三、train.py四、最终结果五、detect.py六、 拓展…...
预测分析(三):基于机器学习的分类预测
文章目录 基于机器学习的分类预测分类任务逻辑回归分类树分类树的工作原理 随机森林多元分类朴素贝叶斯分类器贝叶斯公式回到分类问题**1. 算法原理****2. 主要类型****(1) 高斯朴素贝叶斯****(2) 多项式朴素贝叶斯****(3) 伯努利朴素贝叶斯** **3. 优缺点****4. 应用场景****5…...
基于大模型预测升主动脉瘤的多维度诊疗研究报告
目录 一、引言 1.1 研究背景 1.2 研究目的与意义 二、升主动脉瘤概述 2.1 定义与分类 2.2 发病原因与机制 2.3 流行病学现状 三、大模型技术原理及应用现状 3.1 大模型基本原理 3.2 在医疗领域的应用进展 3.3 针对升主动脉瘤预测的独特价值 四、术前大模型预测方案…...
解决Spring参数解析异常:Name for argument of type XXX not specified
前言 在开发 Spring Boot 应用时,我们常遇到类似 java.lang.IllegalArgumentException: Name for argument not specified 的报错。这类问题通常与方法参数名称的解析机制相关,尤其在使用 RequestParam、PathVariable 等注解时更为常见。 一、问题现象与…...
基数排序算法解析与TypeScript实现
基数排序(Radix Sort)是一种高效的非比较型整数排序算法,通过逐位分配与收集的方式实现排序。本文将深入解析其工作原理,并给出完整的TypeScript实现。 一、算法原理 1. 核心思想 多关键字排序:将整数按位数切割成不同…...
034-QSharedMemory
QSharedMemory 以下为针对 QSharedMemory 的技术调研及实现方案,包含原理、优化策略、完整代码实现及流程图解: 一、QSharedMemory 核心原理 1.1 共享内存机制 共享内存流程图 (注:此处应为共享内存IPC流程图,因文本…...
在 Ubuntu 上离线安装 Prometheus 和 Grafana
在 Ubuntu 上离线安装 Prometheus 和 Grafana 的步骤如下: 一.安装验证 二.安装步骤 1.准备离线安装包 在一台可以访问互联网的机器上下载 Prometheus 和 Grafana 的二进制文件。 Prometheus 下载地址:Prometheus 官方下载页面Grafana 下载地址&#…...
Ansible:playbook的高级用法
文章目录 1. handlers与notify2. tags组件3. playbook中使用变量3.1使用 setup 模块中变量3.2在playbook 命令行中定义变量3.3在playbook文件中定义变量3.4使用变量文件3.5主机清单文件中定义变量主机变量组(公共)变量 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.什么是继承 继承…...
近日八股——计算机网络
一.c. TCP握手为什么三次、不能是二次、或四次? i.不能是两次: 防止已经失效的连接报文突然又传到了服务端,产生错误 如果不采用三次握手,服务端直接建立连接,会白白浪费资源 三次握手告诉服务端,客户端有没有收这个数据&#…...
HOW - Axios 拦截器特性
目录 Axios 介绍拦截器特性1. 统一添加 Token(请求拦截器)2. 处理 401 未授权(响应拦截器)3. 统一处理错误信息(响应拦截器)4. 请求 Loading 状态管理5. 自动重试请求(如 429 过载)6…...
自适应信号处理任务(过滤,预测,重建,分类)
自适应滤波 # signals creation: u, v, d N = 5000 n = 10 u = np.sin(np.arange(0, N/10., N/50000...
电子电气架构 --- 面向服务的体系架构
我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 周末洗了一个澡,换了一身衣服,出了门却不知道去哪儿,不知道去找谁&am…...
TypeScript 装饰器类型详解
TypeScript 装饰器类型详解 一、类装饰器 // 参数:类的构造函数 function ClassDecorator(constructor: Function) {Object.defineProperty(constructor.prototype, timestamp, {value: Date.now()}); }ClassDecorator class DataService {// 装饰后自动添加times…...
Nyquist内置函数-杂项函数
1 Nyquist内置函数-杂项函数 1.1 杂项函数 这些函数对于日常使用来说都是安全且推荐的。 1.1.1 to-mono(sound) [SAL] (to-mono sound) [LISP] 如果 sound 是多声道声音,返回其所有声道的总和;如果 sound 本身就是单声道声音,则直接返回&…...
基姆拉尔森计算公式
基姆拉尔森计算公式(Zellers Congruence 的变体)是一种快速根据公历日期计算星期几的数学公式。其核心思想是通过对年月日的数值进行特定变换和取模运算,直接得到星期几的结果。 公式定义 对于日期 年-月-日,公式如下:…...
5 分钟用满血 DeepSeek R1 搭建个人 AI 知识库(含本地部署)
最近很多朋友都在问:怎么本地部署 DeepSeek 搭建个人知识库。 老实说,如果你不是为了研究技术,或者确实需要保护涉密数据,我真不建议去折腾本地部署。 为什么呢? 目前 Ollama 从 1.5B 到 70B 都只是把 R1 的推理能力…...
Python数据可视化-第6章-坐标轴的定制
环境 开发工具 VSCode库的版本 numpy1.26.4 matplotlib3.10.1 ipympl0.9.7教材 本书为《Python数据可视化》一书的配套内容,本章为第6章 坐标轴的定制 本章主要介绍了坐标轴的定制,包括向任意位置添加坐标轴、定制刻度、隐藏轴脊和移动轴脊。 参考 第…...
18认识Qt坐标系
平面直角坐标系(笛卡尔坐标系) 数学上的坐标系 右手坐标系 计算机中的坐标系 左手坐标系 坐标系的原点(0,0) 就是屏幕的左上角 /窗口的左上角 给 Qt 的某个控件,设置位置,就需要指定坐标.对于这个控件来说, 坐标系原点就是相对于父窗口/控件的. QPushButton 的父元素/父控件/父…...
动态循环表单+动态判断表单类型+动态判断表单是否必填方法
页面效果: 接口请求到的数据格式: list: [{demandType: "设备辅助功能要求",demandSettingList: [{id: "1907384788664963074",name: "测试表单",fieldType: 0,contentValue: "",vaildStatus: 0, // 0 非必填&a…...
keep-alive缓存
#keep-alive缓存动态路由的使用指南# 代码如下图 : <router-view v-slot"{ Component }"> <keep-alive :include"[Hot, Notifications, User, Setting, Test]"> <component :is"Component" …...
25.4.3学习总结【Java】
又是一道错题: 1. 班级活动https://www.lanqiao.cn/problems/17153/learning/?page1&first_category_id1&sortdifficulty&asc1&second_category_id3 问题描述 小明的老师准备组织一次班级活动。班上一共有 n 名 (n 为偶数) 同学,老师…...
Python入门(3):语句
目录 1 基本语句 1.1 表达式语句 1.2 赋值语句 2 控制流语句 2.1 条件语句 2.2 循环语句 while循环: for循环: 2.3 流程控制语句 1. break语句:退出整个循环体 2. continue语句:只跳过本次循环,还会进…...
运维之 Centos7 防火墙(CentOS 7 Firewall for Operations and Maintenance)
运维之 Centos7 防火墙 1.介绍 Linux CentOS 7 防火墙/端口设置: 基础概念: 防火墙是一种网络安全设备,用于监控和控制网络流量,以保护计算机系统免受未经授权的访问和恶意攻击。Linux CentOS 7操作系统自带了一个名为iptables的…...
开发一个小程序需要多久时间?小程序软件开发周期
开发一个小程序所需时间受多种因素影响,以下为你详细列举: 一、需求复杂度。若只是简单展示类小程序,如企业宣传、产品介绍,功能单一,大概 1 - 2 周可完成。若涉及复杂交互,像电商小程序,涵盖商…...
【数据结构篇】算法征途:穿越时间复杂度与空间复杂度的迷雾森林
文章目录 【数据结构篇】算法征途:穿越时间复杂度与空间复杂度的迷雾森林 一、 什么是算法1. 算法的定义1.1 算法的五个特征1.2 好算法的特质 2. 时间复杂度3. 空间复杂度 【数据结构篇】算法征途:穿越时间复杂度与空间复杂度的迷雾森林 💬欢…...
新增帧能耗指标|UWA Gears V1.0.9
UWA Gears 是UWA最新发布的无SDK性能分析工具。针对移动平台,提供了实时监测和截帧分析功能,帮助您精准定位性能热点,提升应用的整体表现。 本次版本更新主要新增帧能耗指标,帮助大家对每一帧的能耗进行精准监控,快速…...
