Rust利用tauri制作个效率小工具

目录
  • 先看效果
  • 要解决的问题
    • 唤起方式
    • 菜单出现的位置
  • 最后

日常使用电脑中经常会用到一个quicke工具中的轮盘菜单工具。

但quicke免费版很多功能不支持,且它的触发逻辑用的不舒服,经常误触。

本着靠人不让靠自己,自己动手丰衣足食的理念,用tauri撸一个小工具。

先看效果

要解决的问题

唤起方式

因为要通过鼠标进行交互,所以必然会影响系统默认的鼠标行为。

为了减少交互冲突,选择长按右键唤起菜单。

就要解决如下问题:

1、默认情况要阻止右键鼠标的事件传递给操作系统

2、当右键按住时间小于设置长按唤起时间,要自动给系统发送一个右键按下和右键松开的事件

由于tauri没有提供相关的api,所以要从Rust的crate中找看看有没有相关包。

经过一番搜索,找到了rdev这个包,它提供了基础的系统级的鼠标键盘事件处理。

使用rdev::grab就可以监听鼠标键盘事件, 并且阻止事件传递

tauri::async_runtime::spawn(async move {
    rdev::grab(move |event| {
        let is_block: bool = match event.event_type {
            EventType::ButtonPress(button) => {
                match button {
                    Button::Right => {
                         unsafe {
                            !IS_SIMULATE
                         }
                    }
                    _ => { false }
                }
            }
            EventType::ButtonRelease(button) => {
                match button {
                    Button::Right => {
                        unsafe {
                            !IS_SIMULATE
                        }
                    }
                    _ => { false }
                }
            }
            _ => { false }
        };
        if is_block {
            None
        } else {
            Some(event)
        }
    }).unwrap();
});

通过tauri::async_runtime::spawn创建个异步任务

IS_SIMULATE是一个全局变量默认false会阻止右击事件,自动触发事件前会设置为true,使事件不被阻止,完成后再设置为false

rdev::grab通过流处理让右键的按下和松开返回个None阻止事件传递。

菜单出现的位置

我们希望唤起菜单中心在鼠标当前位置,所以

1、获取右击按下时的系统坐标信息

2、把系统的坐标传递给菜单窗口实现定位

由于rdev的鼠标点击事件没有鼠标位置信息,所以我们要在鼠标移动时保存坐标信息

EventType::MouseMove { x, y } => {
    unsafe {
        MOUSE_POSITION = (x, y);
    }
    false
}

按下鼠标是传递坐标

EventType::ButtonPress(button) => {
    unsafe {
        if !IS_SIMULATE {
            roulette_window.emit("buttondown", ButtonPayload { button: get_button_name(&button), x: MOUSE_POSITION.0, y: MOUSE_POSITION.1 }).unwrap();
        }
    }
    match button {
        Button::Right => {
            unsafe {
                !IS_SIMULATE
            }
        }
        _ => { false }
    }
}

同时我们把窗口设置全屏展示,这样系统的坐标 == 鼠标在窗口的坐标

接下来在窗口内绘制需要数量的扇形就完成了基本的制作。

这里使用SVG来绘制扇形菜单

菜单数据:

const config: {
  id: string;
  text?: string;
  image?: string;
  callback?: () => void;
}[] = []

tip: 根据菜单数量已经提前计算path需要的坐标信息

在react内渲染

  <svg className='menu' width={SIZE * 2} height={SIZE * 2} xmlns="http://www.w3.org/2000/svg">
    <g>
      <circle id='center' className='center' cx={SIZE} cy={SIZE} r={CENTER_SIZE} />
      {
        active
        && (
          active.id === 'close'
            ? (
              <text
                className='center-text'
                x={SIZE}
                y={SIZE}
                fill='red'
              >
                关闭
              </text>
            )
            : (
              <text
                className='center-text'
                x={SIZE}
                y={SIZE}
              >
                {active?.text}
              </text>
            )
        )
      }
    </g>
    {
      menu.map(({ id, text, image, points, center }) => (
        <g key={id}>
          <path
            id={id}
            className='item' d={`M ${points[0][0]} ${points[0][1]} A ${SIZE} ${SIZE}, 0, 0, 1, ${points[1][0]} ${points[1][1]} L ${points[2][0]} ${points[2][1]} A ${CENTER_SIZE} ${CENTER_SIZE}, 0, 0, 0, ${points[3][0]} ${points[3][1]} Z`}
          />
          {
            image
            && (
              <image
                className='item-img'
                xlinkHref={image}
                x={center[0] - 15}
                y={center[1] - 25}
                width='30'
              />
            )
          }
          {
            text
            && (
              <text
                className='item-text'
                x={center[0]}
                y={center[1] + 25}
              >
                {text}
              </text>
            )
          }
        </g>
      ))
    }
  </svg>

在窗口内通过document.addEventListener监听mousemove获取鼠标所在的块上,当松开鼠标时就能执行对应的任务。

最后

目前的菜单功能都是写死在代码里的,之后会加上配置功能,并且支持自己编写代码来控制每个菜单对应的具体操作。

后续还可以加上根据焦点应用来分别展示不同的菜单数据。

到此这篇关于Rust利用tauri制作个效率小工具的文章就介绍到这了,更多相关Rust tauri制作效率小工具内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • flutter使用tauri实现一个一键视频转4K软件

    目录 前言 开发原因 工作原理 开发过程 前言 先说结论,tauri是一个非常优秀的前端桌面开发框架,但是,rust门槛太高了. 一开始我是用electron来开发的,但是打包后发现软件运行不是很流畅,有那么一点卡顿.于是为了所谓的性能,我尝试用tauri来做我的软件.在学了两星期的rust后,我发现rust真的太难学了,最后硬是边做边查勉强做出来了. 软件运行起来是比electron做的丝滑很多,但是写rust真的是很痛苦,rust的写法和其他语言是截然不同的,在不知道之前我是个rust吹,觉

  • Rust利用tauri制作个效率小工具

    目录 先看效果 要解决的问题 唤起方式 菜单出现的位置 最后 日常使用电脑中经常会用到一个quicke工具中的轮盘菜单工具. 但quicke免费版很多功能不支持,且它的触发逻辑用的不舒服,经常误触. 本着靠人不让靠自己,自己动手丰衣足食的理念,用tauri撸一个小工具. 先看效果 要解决的问题 唤起方式 因为要通过鼠标进行交互,所以必然会影响系统默认的鼠标行为. 为了减少交互冲突,选择长按右键唤起菜单. 就要解决如下问题: 1.默认情况要阻止右键鼠标的事件传递给操作系统 2.当右键按住时间小于设

  • python制作英语翻译小工具代码实例

    这篇文章主要介绍了python制作英语翻译小工具代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 用python爬虫可以制作英语翻译小工具.来看下代码吧- import requests,json #函数封装 def translator(): session=requests.session() i=input('请问你要翻译什么?') url='http://fanyi.youdao.com/translate' headers={

  • Python制作简易版小工具之计算天数的实现思路

    需求 给定一个日期,格式如 "2020-2-12",计算出这个日期是 2020 年的第几天? 实现思路 使用 tkinter 和 tkinter.ttk 对界面进行布置: 使用 calendar 计算天数: 规范输入日期的格式: 对月份,天数进行逻辑判断: 输入错误抛出异常提示. 代码实现 # -*- coding: utf-8 -*- ''' @File: calc_day_v2.py @Time: 2020/02/12 20:33:22 @Author: 大梦三千秋 @Contac

  • 详解如何利用Python制作24点小游戏

    目录 先睹为快 游戏规则(改编自维基百科) 逐步实现 Step1:制作24点生成器 Step2:定义游戏精灵类 Step3:实现游戏主循环 先睹为快 24点 游戏规则(改编自维基百科) 从1~10这十个数字中随机抽取4个数字(可重复),对这四个数运用加.减.乘.除和括号进行运算得出24.每个数字都必须使用一次,但不能重复使用. 逐步实现 Step1:制作24点生成器 既然是24点小游戏,当然要先定义一个24点游戏生成器啦.主要思路就是随机生成4个有解的数字,且范围在1~10之间,代码实现如下:

  • SendTo增强版 批处理实用小工具

    这是我用批处理制作的小软件,其中涉及到的知识点有注册表的查询添加.添加环境变量.动态显示选择提示.以及怎么在批处理中使用配置文件等等的内容.由于功能比较多,我虽然做了很多的测试但仍然不能保证不出问题,有问题.建议.以及代码的讨论欢迎跟贴.由于批处理的功能有限,软件自带两个命令行小工具,单纯的用批处理实现是不可能的,希望有能力并感兴趣的朋友能不能做个 VBS 脚本版的.祝大家节日快乐. 附图一张 帮助: 本软件是用批处理制作的实用小工具,安装后会给"发送到"增加一些实用的特性,如:复制文

  • Python实现一个Git日志统计分析的小工具

    前言 本文介绍的是利用Python实现的一个小工具,用于分析Git commit log,获得Git Project每个成员的简单行为数据. Warning:代码量不能代表程序员能力水平! 启动参数 共5个. Repo地址 Commit 起始日期 Commit 结束日期 Git仓库子目录 统计分析结果CSV文件目标路径 exec_git Git Log命令: git -C {} log --since={} --until={} --pretty=tformat:%ae --shortstat

  • Python利用PaddleOCR制作个搜题小工具

    目录 介绍 安装 安装PaddlePaddle飞桨框架 安装PaddleOCR 代码使用 搜题小工具 安装ADB 截图并保存题目区域图片 OCR识别,获取题目 打开浏览器搜索 完整代码 介绍 PaddleOCR 是一个基于百度飞桨的OCR工具库,包含总模型仅8.6M的超轻量级中文OCR,单模型支持中英文数字组合识别.竖排文本识别.长文本识别.同时支持多种文本检测.文本识别的训练算法. 本教程将介绍PaddleOCR的基本使用方法以及如何使用它开发一个自动搜题的小工具. 项目地址 OR 安装 虽然

  • 如何基于Python制作有道翻译小工具

    这篇文章主要介绍了如何基于Python制作有道翻译小工具,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 该工具主要是利用了爬虫,爬取web有道翻译的内容. 然后利用简易GUI来可视化结果. 首先我们进入有道词典的首页,并点击翻译结果的审查元素 之后request响应网页,并分析网页,定位到翻译结果. 使用tkinter来制作一个建议的GUI 期间遇到的一个问题则是如何刷新翻译的结果,否则的话会在text里一直累加翻译结果. 于是,在mainlo

  • 利用python制作拼图小游戏的全过程

    开发工具 Python版本:3.6.4 相关模块: pygame模块: 以及一些Python自带的模块 关注公众号:Python学习指南,回复"拼图"即可获取源码 环境搭建 安装Python并添加到环境变量,pip安装需要的相关模块即可. 原理介绍 游戏简介: 将图像分为m×n个矩形块,并将图像右下角的矩形块替换为空白块后,将这些矩形块随机摆放成原图像的形状.游戏目标为通过移动非空白块将随机摆放获得的图像恢复成原图像的模样,且规定移动操作仅存在于非空白块移动到空白块. 例如下图所示:

  • 基于Python制作一个文件去重小工具

    目录 前言 实现步骤 补充 前言 常常在下载网络素材时有很多的重复文件乱七八糟的,于是想实现一个去重的操作. 主要实现思路就是遍历出某个文件夹包括其子文件夹下面的所有文件,最后,将所有文件通过MD5函数的对比筛选出来,最后将重复的文件移除. 实现步骤 用到的第三方库都比较的常见,其中只有hashlib是用来对比文件的不是很常见.其他的都是一些比较常见的第三方库用来做辅助操作. import os # 应用文件操作 import hashlib # 文件对比操作 import logging #

随机推荐