【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.pswp.cn/pingmian/75870.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/75870.shtml
英文地址,請注明出處:http://en.pswp.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;分享給更…