【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 - 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.mzph.cn/pingmian/75870.shtml

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

相关文章

【问题处理】webpack4升webpack5,报错Uncaught ReferrnceError: process is not defined

问题 正在做webpack4升webpack5&#xff0c;项目构建项目成功后在浏览器打开时报错 Uncaught ReferrnceError: process is not defined。 原因 webpack 5 不再自动 polyfill Node.js 的核心模块。 如果你在浏览器运行的代码中使用它&#xff0c;需要从 NPM 中安装兼容模块…

软件工程师减肥计划

一、目标设定 在 3 个月内减轻体重 5-7kg&#xff0c;改善身体代谢水平和体脂率&#xff0c;增强身体活力和精神状态&#xff0c;以更好地适应工作强度。 二、饮食调整 &#xff08;一&#xff09;基本原则 控制热量摄入&#xff0c;保证每天摄入热量低于消耗热量 500-800 …

即时访问成为降低风险的关键

云计算和软件即服务 (SaaS) 解决方案的广泛采用从根本上重塑了企业的数字格局。 不同行业的组织越来越多地利用云固有的可扩展性和成本效益来推动创新和简化运营。 这种向基于云的环境的转变也带来了一系列新的复杂安全挑战&#xff0c;需要仔细考虑并制定强有力的缓解策略。…

[环境配置] 1. 开发环境搭建

开发环境搭建 本文档将详细介绍如何搭建深度学习开发环境&#xff0c;包括 Python 环境配置、IDE 选择与配置以及虚拟环境管理。 也会介绍一下最近比较流行的 uv 工具。它是一个用 Rust 编写的极其快速的 Python 包和项目管理工具。 uv 是一个非常强大的工具&#xff0c;它可…

rust 同时处理多个异步任务,并在一个任务完成退出

use std::thread; use tokio::{sync::mpsc,time::{sleep, Duration}, };async fn check_for_one() {// 该函数会每秒打印一次 "write"loop {println!("write");sleep(Duration::from_secs(1)).await;} }async fn start_print_task() -> Result<(), (…

“群芳争艳”:CoreData 4 种方法计算最大值的效率比较(上)

概览 在 CoreData 支持的 App 中&#xff0c;一种常见操作就是计算数据库表中指定字段的最大值&#xff08;或最小值&#xff09;。就是这样一种看起来“不足挂齿”的任务&#xff0c;可能稍不留神就会“马失前蹄”。 在实际的代码中&#xff0c;我们怎样才能既迅速又简洁的…

skynet网络包库(lua-netpack.c)的作用解析

目录 网络包库&#xff08;lua-netpack.c&#xff09;的作用解析1. 数据包的分片与重组2. 网络事件处理3. 内存管理4. 数据打包与解包 动态库&#xff08;.so&#xff09;在 Lua 中的使用1. 编译为动态库2. Lua 中加载与调用(1) 加载模块(2) 核心方法(3) 使用示例 3. 注意事项 …

计科数据库第二次上机操作--实验二 表的简单查询

一、建数据库和表 1&#xff0e;启动数据库服务软件 Navicat 2&#xff0e;在 Navicat 中建立数据库 test 3. 在test数据库上建立teacher表&#xff1a; 二、基本查询 2.1 从teacher表中分别检索出教师的所有信息 SELECT * FROM teacher WHERE 教工号2000; SELECT * FROM t…

WPF依赖注入

一、IOC 在 WPF 中的原理 控制反转&#xff08;IOC&#xff09;是一种设计原则&#xff0c;它将对象的创建和依赖关系的管理从对象本身转移到外部容器&#xff08;IOC 容器&#xff09;。在传统的编程方式中&#xff0c;一个对象如果需要使用另一个对象&#xff08;即存在依赖…

【大模型深度学习】如何估算大模型需要的显存

一、模型参数量 参数量的单位 参数量指的是模型中所有权重和偏置的数量总和。在大模型中&#xff0c;参数量的单位通常以“百万”&#xff08;M&#xff09;或“亿”&#xff08;B&#xff0c;也常说十亿&#xff09;来表示。 百万&#xff08;M&#xff09;&#xff1a;表示…

BUUCTF流量分析题

文章目录 前言wireshark被嗅探的流量被偷走的文件easycap数据包中的线索秘密文件[安洵杯 2019]Attack (难&#xff0c;没写)被劫持的神秘礼物大流量分析&#xff08;一&#xff09;大流量分析&#xff08;二&#xff09;大流量分析&#xff08;三&#xff09;模板模板 前言 CT…

adb检测不到原来的设备List of devices attached解决办法

进设备管理器-通用串行总线设备 卸载无法检测到的设备驱动 重新拔插数据线

mapbox基础,加载栅格图片到地图

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:mapbox 从入门到精通 文章目录 一、🍀前言1.1 ☘️mapboxgl.Map 地图对象1.2 ☘️mapboxgl.Map style属性1.3 ☘️raster 栅格图层 api二、🍀使用本地载…

复活之我会二分

文章目录 整数二分模板模板1&#xff1a;满足条件的第一个数模板2&#xff1a;满足条件的最后一个数 浮点数二分模板一、Building an Aquarium思路分析具体代码 二、Tracking Segments思路分析具体代码 三、Wooden Toy Festival思路分析具体代码 四、路标设置思路分析具体代码 …

每日c/c++题 备战蓝桥杯(握手问题)

试题 A: 握手问题 题解 题目描述 小蓝组织了一场算法交流会议&#xff0c;共有50人参加。按照惯例&#xff0c;每个人都要与除自己外的其他所有人握手一次。但有7个人彼此之间没有握手&#xff08;这7人与其他43人正常握手&#xff09;。求实际发生的握手总次数。 解题思路 …

mysql8.0.29 win64下载

mysql win64安装包 mysql win64安装包下载 mysql win64安装包下载 通过网盘分享的文件&#xff1a;mysql 链接: https://pan.baidu.com/s/1sEOl-wSVtOG5gfIRdt5MXw?pwdgi7i 提取码: gi7i

browser-use开源程序使 AI 代理可以访问网站,自动完成特定的指定任务,告诉您的计算机该做什么,它就会完成它。

一、软件介绍 文末提供程序和源码下载 browser-use开源程序使 AI 代理可以访问网站&#xff0c;自动完成特定的指定任务&#xff0c;浏览器使用是将AI代理与浏览器连接的最简单方法。告诉您的计算机该做什么&#xff0c;它就会完成它。 二、快速开始 使用 pip &#xff08;Py…

CAD格式转换器:Acme CAD Converter

Acme CAD Converter 是一款专业的多功能 CAD 文件管理工具&#xff0c;支持 ‌DWG/DXF/DWF 文件查看、批量格式转换及版本降级‌&#xff0c;适用于工程设计、图纸归档等场景‌。软件兼容 AutoCAD R2.5 至 2023 版本文件‌&#xff0c;可输出为 PDF、JPEG、TIFF、SVG 等 20 格式…

vmware虚拟机上Ubuntu或者其他系统无法联网的解决方法

一、检查虚拟机是否开启了网络服务 打开方式&#xff1a;控制面板->-管理工具--->服务 查找 VMware DHCP Service 和VMware NAT Service &#xff0c;确保这两个服务已经启动。如下图&#xff0c;没有启动就点击启动。 二、设置网络类型 我们一般使用前两种多一些&…

数据结构与算法:基础与进阶

&#x1f31f; 各位看官好&#xff0c;我是maomi_9526&#xff01; &#x1f30d; 种一棵树最好是十年前&#xff0c;其次是现在&#xff01; &#x1f680; 今天来学习C语言的相关知识。 &#x1f44d; 如果觉得这篇文章有帮助&#xff0c;欢迎您一键三连&#xff0c;分享给更…