当前位置: 首页 > article >正文

<rust><tauri><GUI>基于tauri,打开任意windows电脑应用程序

前言

本文是基于rust和tauri,由于tauri是前、后端结合的GUI框架,既可以直接生成包含前端代码的文件,也可以在已有的前端项目上集成tauri框架,将前端页面化为桌面GUI。

环境配置
  1. 系统:windows 10
  2. 平台:visual studio code
  3. 语言:rust、javascript
  4. 库:tauri2.0
概述

本文是基于tauri框架下,打开系统安装的任意应用程序。

1、创建前端项目

如何创建前端项目以及集成tauri,本文不再赘述,可以参考之前的博文:
1、<tauri><rust><GUI>基于rust和tauri,在已有的前端框架上手动集成tauri示例
或者参考tauri的官网说明:
https://tauri.app/zh-cn/start/frontend/

本文的目的,是通过tauri程序来打开windows系统中的任意应用程序,我们需要先安装一个插件opener:

npm run tauri add opener

这个插件既可以在javascript中使用,也可以在rust中使用,本文将在rust中来使用。
官网rust使用实例:

use tauri_plugin_opener::OpenerExt;

// 使用默认的应用来打开文件:
app.opener().open_path("/path/to/file", None::<&str>);
// 在 Windows 上使用 `vlc` 打开文件:
app.opener().open_path("C:/path/to/file", Some("vlc"));

上述代码中的app变量,其类型是App或者AppHandle的实例。

照例,我们先创建一个新的html页面布局,openapp.html:

<div id="openappdiv" class="openappdiv">

    <div id="systemappdiv" class="systemappdiv">
        <p>系统应用:</p>
        <figure>
            <img id="notepadimg" class="notepadimg" src="../images/notepad.png" alt="notepad" width="64" height="64"/>
            <figcaption>记事本</figcaption>
        </figure>
        <figure>
            <img id="painteditorimg" src="../images/painteditor.png" alt="painteditor" width="64" height="64"/>
            <figcaption>画图</figcaption>
        </figure>
        
    </div>
    <div id="normalappdiv" class="normalappdiv">
        <p>普通应用:</p>
        <figure>
            <img id="plcimg" src="../images/plc.png" alt="plc" width="64" height="64"/>
            <figcaption>汇川PLC</figcaption>
        </figure>
        <figure>
            <img id="lupingimg" src="../images/luping.png" alt="录制" width="64" height="64"/>
            <figcaption>录制</figcaption>
        </figure>
    </div>
</div>

然后为其添加布局样式openapp.css:

.app{
    display: flex;
    flex-direction: column;
    gap: 20px;
}
.openappdiv{
    display: flex;
    flex-direction: column;
    gap: 10px;
    margin: 20px;
}
.systemappdiv{
    display: flex;
    flex-direction: row;
    gap: 10px;

}
.normalappdiv{
    display: flex;
    flex-direction: row;
    gap: 10px;
}
img{
    background-color: #fffbfb;
}
img:hover{
    background-color: #81f323;
}
img:active{
    background-color: #d3d6d3;
}

页面运行后效果如下:
在这里插入图片描述
当我们点击相应应用的图标时,将打开对应的应用程序。当然,我们也可以指定对应应用的文件,这样打开时会同时打开文件,如果未指定,则默认打开空应用。

2、打开应用

前文说过,我们使用插件opener来实现应用打开功能,而且是在rust端实现,所以,我们需要先在rust中添加函数,以供前端调用。
别忘了添加权限:
src-tauri/capabilities/default.json

"opener:allow-open-path",

我们创建一个openapp函数:

#[tauri::command]
fn openapp(app:tauri::AppHandle,file:String,appname:String) -> Result<(), String> {
    
    if appname.is_empty() {
        match app.opener().open_path(file, None::<&str>) {
            Ok(()) => Ok(()),
            Err(e) => Err(format!("打开应用失败:{}", e)),
        }
    } else {
        match app.opener().open_path(file, Some(appname)) {
            Ok(()) => Ok(()),
            Err(e) => Err(format!("打开应用失败:{}", e)),
        }
    }    
    
}

注意上述函数中的app变量,必须是App或者AppHandle。另外传入的参数是文件名和应用名(准确的说,是安装路径)。
open_path有两个参数,文件路径和应用路径,必须要有一个是有值的,且存在于系统中,即如果未提供文件名,那么默认打开空应用,如果未提供应用名,那么打开时,会根据文件类型,使用系统的默认应用来打开。
然后我们在前端调用此函数:

   function openfile(file,appname){
        invoke('openapp',{file:file,appname:appname}).then(
                (res) => {
                    console.log(res);
                }
            ).catch(
                (err) => {
                    console.log(err);
                }
            )
    }

我们使用invoke函数来调用rust端的函数,可以捕获rust函数返回的错误信息。
然后,我们获取img元素,监控其单击事件即可:

const notepadimg = document.getElementById('notepadimg');
    const painteditorimg = document.getElementById('painteditorimg');
    const plcimg = document.getElementById('plcimg');
    const lupingimg = document.getElementById('lupingimg');

    notepadimg.addEventListener('click', async () => {
        const appname = "C:\\Windows\\System32\\notepad.exe"
        openfile("",appname)
    })

    painteditorimg.addEventListener('click', async () => {
        const appname = "C:\\Windows\\System32\\mspaint.exe"
        openfile("",appname)
    })

    plcimg.addEventListener('click', async () => {
        const appname = "F:\\Inovance Control\\AutoShop\\AutoShop.exe"
        openfile("",appname)
    })

    lupingimg.addEventListener('click', async () => {
        const appname = "E:\\班迪录屏6.0.1\\BandicamPortable.exe"
        openfile("",appname)
    })

本例中,我们未提供文件,默认打开的都是空应用,如果要提供文件,可以使用对话框获取文件路径,然后打开。

3、动态演示

tauri打开windows应用演示


http://www.kler.cn/a/581852.html

相关文章:

  • 如何手动下载spring jar包
  • Vue.js 全面解析:构建现代前端应用的渐进式框架
  • SPA应用优化首屏加载速度
  • C++20 新特性总结
  • AWS原生架构下的服务器性能与成本平衡之道——海外业务云端实践
  • 用Python实现链上数据爬取与分析
  • RISC-V特权模式与寄存器
  • MATLAB 控制系统设计与仿真 - 22
  • 从零开始用AI开发游戏(一)
  • 关于在electron(Nodejs)中使用 Napi 的简单记录
  • 【GPT入门】第6课 openai接口介绍与参数说明
  • 远程手机遥控开关原理及应用
  • git commit messege 模板设置 (规范化管理git)
  • 机器学习基础(4)
  • 清华同方国产电脑能改windows吗_清华同方国产系统改win7教程
  • 《PaddleOCR》—— OCR
  • Agentic RAG 详解 - 从头开始​​构建你自己的智能体系统
  • 【web】网页崩溃
  • Cannot resolve symbol ‘view‘ Androidstudio报错解决办法
  • json中文编码问题