<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>使用tauri实现一个简单的计算器程序

或者参考tauri的官网说明: tauri.app/zh-cn/start...

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

javascript 复制代码
npm run tauri add opener

这个插件既可以在javascript中使用,也可以在rust中使用,本文将在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:

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:

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

json 复制代码
"opener:allow-open-path",

我们创建一个openapp函数:

rust 复制代码
#[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有两个参数,文件路径和应用路径,必须要有一个是有值的,且存在于系统中,即如果未提供文件名,那么默认打开空应用,如果未提供应用名,那么打开时,会根据文件类型,使用系统的默认应用来打开。 然后我们在前端调用此函数:

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

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

javascript 复制代码
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、动态演示

live.csdn.net/v/468204

相关推荐
Moment11 分钟前
前端白屏检测SDK:从方案设计到原理实现的全方位讲解 ☺️☺️☺️
前端·javascript·面试
阿波次嘚15 分钟前
关于在electron(Nodejs)中使用 Napi 的简单记录
前端·javascript·electron
接着奏乐接着舞。17 分钟前
Electron + Vue 项目如何实现软件在线更新
javascript·vue.js·electron
Ting丶丶21 分钟前
Electron入门笔记
javascript·笔记·electron
咖啡虫22 分钟前
解决 React 中的 Hydration Failed 错误
前端·javascript·react.js
贩卖纯净水.23 分钟前
《React 属性与状态江湖:从验证到表单受控的实战探险》
开发语言·前端·javascript·react.js
束尘24 分钟前
React面试(二)
javascript·react.js·面试
束尘25 分钟前
React通过命令式的弹窗控制,实现组件封装
javascript·react.js·ecmascript
鸿是江边鸟,曾是心上人1 小时前
echarts使用记录
javascript·ecmascript·echarts
好_快1 小时前
Lodash源码阅读-nth
前端·javascript·源码阅读