Rust练手项目,写个有趣的小工具定时从一言网获取一段有趣的话并推送通知
Rust练手项目,写个有趣的小工具
- 代码
继续练习Rust, 写个小工具定时从一言网获取一段有趣的话并提示,如下
练习以下Rust点
- 并发编程 Mutex, Arc指针使用
- HTTP请求
- Windows Gui
代码
Cargo.toml
[package]
name = "funny_word"
edition = "2021"
version.workspace = true
authors.workspace = true
description.workspace = true[dependencies]
trayicon = "0.2.0"
winapi = { version = "0.3.9", features = ["winuser","windef","minwindef","shellapi","libloaderapi","commctrl","basetsd",
] }
win-toast-notify = "0.1.6"
windows = { version = "0.58.0", features = ["Win32_Security","Win32_System_Threading","Win32_UI_WindowsAndMessaging",
] }
reqwest = { version = "0.11", features = ["blocking"] }
[package]
name = "funny_word"
edition = "2021"
version.workspace = true
authors.workspace = true
description.workspace = true[dependencies]
trayicon = "0.2.0"
winapi = { version = "0.3.9", features = ["winuser","windef","minwindef","shellapi","libloaderapi","commctrl","basetsd",
] }
win-toast-notify = "0.1.6"
windows = { version = "0.58.0", features = ["Win32_Security","Win32_System_Threading","Win32_UI_WindowsAndMessaging",
] }
reqwest = { version = "0.11", features = ["blocking"] }
main.rs
#![windows_subsystem = "windows"]
use core::mem::MaybeUninit;
use std::{sync::{Arc, Mutex},thread::sleep,time::Duration,
};
use trayicon::*;
use win_toast_notify::WinToastNotify;
use winapi::um::winuser;fn main() {#[derive(Copy, Clone, Eq, PartialEq, Debug)]enum Events {RightClickTrayIcon,LeftClickTrayIcon,OneMinute,FiveMinute,FifteenMinute,HalfHour,OneHour,Exit,}let (sender, receiver) = std::sync::mpsc::channel::<Events>();let icon_bytes = include_bytes!("rust.ico");let mut tray_icon = TrayIconBuilder::new().sender(move |e: &Events| {let _ = sender.send(*e);}).icon(Icon::from_buffer(icon_bytes, None, None).unwrap()).tooltip("💪没事喝点鸡汤吧!").on_right_click(Events::RightClickTrayIcon).on_click(Events::LeftClickTrayIcon).menu(MenuBuilder::new().separator().submenu("提醒间隔",MenuBuilder::new().checkable("1分钟", true, Events::OneMinute).checkable("5分钟", false, Events::FiveMinute).checkable("15分钟", false, Events::FifteenMinute).checkable("半小时", false, Events::HalfHour).checkable("一小时", false, Events::OneHour),).separator().item("退出", Events::Exit),).build().unwrap();let _interval = Arc::new(Mutex::new(1));let interval = _interval.clone();std::thread::spawn(move || {receiver.iter().for_each(|m| match m {Events::RightClickTrayIcon => {tray_icon.show_menu().unwrap();}Events::LeftClickTrayIcon => {tray_icon.show_menu().unwrap();}Events::Exit => {std::process::exit(0);}Events::OneMinute => {let mut i = interval.lock().unwrap();*i = 1;tray_icon.set_menu_item_checkable(Events::OneMinute, true).unwrap();tray_icon.set_menu_item_checkable(Events::FiveMinute, false).unwrap();tray_icon.set_menu_item_checkable(Events::FifteenMinute, false).unwrap();tray_icon.set_menu_item_checkable(Events::HalfHour, false).unwrap();tray_icon.set_menu_item_checkable(Events::OneHour, false).unwrap();}Events::FiveMinute => {let mut i = interval.lock().unwrap();*i = 5;tray_icon.set_menu_item_checkable(Events::OneMinute, false).unwrap();tray_icon.set_menu_item_checkable(Events::FiveMinute, true).unwrap();tray_icon.set_menu_item_checkable(Events::FifteenMinute, false).unwrap();tray_icon.set_menu_item_checkable(Events::HalfHour, false).unwrap();tray_icon.set_menu_item_checkable(Events::OneHour, false).unwrap();}Events::FifteenMinute => {let mut i = interval.lock().unwrap();*i = 15;tray_icon.set_menu_item_checkable(Events::OneMinute, false).unwrap();tray_icon.set_menu_item_checkable(Events::FiveMinute, false).unwrap();tray_icon.set_menu_item_checkable(Events::FifteenMinute, true).unwrap();tray_icon.set_menu_item_checkable(Events::HalfHour, false).unwrap();tray_icon.set_menu_item_checkable(Events::OneHour, false).unwrap();}Events::HalfHour => {let mut i = interval.lock().unwrap();*i = 30;tray_icon.set_menu_item_checkable(Events::OneMinute, false).unwrap();tray_icon.set_menu_item_checkable(Events::FiveMinute, false).unwrap();tray_icon.set_menu_item_checkable(Events::FifteenMinute, false).unwrap();tray_icon.set_menu_item_checkable(Events::HalfHour, true).unwrap();tray_icon.set_menu_item_checkable(Events::OneHour, false).unwrap();}Events::OneHour => {let mut i = interval.lock().unwrap();*i = 60;tray_icon.set_menu_item_checkable(Events::OneMinute, false);tray_icon.set_menu_item_checkable(Events::FiveMinute, false);tray_icon.set_menu_item_checkable(Events::FifteenMinute, false);tray_icon.set_menu_item_checkable(Events::HalfHour, false);tray_icon.set_menu_item_checkable(Events::OneHour, true);}})});std::thread::spawn(move || loop {match reqwest::blocking::get("https://v1.hitokoto.cn?&encode=text") {Ok(resp) => match resp.text() {Ok(text) => {WinToastNotify::new().set_title("来自一言网").set_messages(vec![&text]).show().expect("发送通知失败!");}Err(e) => {WinToastNotify::new().set_title("错误").set_messages(vec![&format!("HTTP错误 {}",e.status().unwrap_or_default())]).show().expect("发送通知失败!");}},Err(e) => {WinToastNotify::new().set_title("获取网站内容失败错误").set_messages(vec![&format!("HTTP错误 {}",e.status().unwrap_or_default())]).show().expect("发送通知失败!");}}let mut _b = 1;{// 加个大括号是为了尽快释放lock, 免得睡眠中(60 * (*i))一直占用锁,点击右键菜单无反应let interval = _interval.clone();let i = interval.lock().unwrap();_b = *i;}sleep(Duration::from_secs(60 * _b));});loop {unsafe {let mut msg = MaybeUninit::uninit();let bret = winuser::GetMessageA(msg.as_mut_ptr(), 0 as _, 0, 0);if bret > 0 {winuser::TranslateMessage(msg.as_ptr());winuser::DispatchMessageA(msg.as_ptr());} else {break;}}}
}
rust.ico图标文件放在main.rs目录
相关文章:
Rust练手项目,写个有趣的小工具定时从一言网获取一段有趣的话并推送通知
Rust练手项目,写个有趣的小工具 代码 继续练习Rust, 写个小工具定时从一言网获取一段有趣的话并提示,如下 练习以下Rust点 并发编程 Mutex, Arc指针使用HTTP请求Windows Gui 代码 Cargo.toml [package] name "funny_word" edition "20…...
【隐私计算】Paillier半同态加密算法
一、何为同态加密(HE)? HE是一种特殊的加密方法,它允许直接对加密数据执行计算,如加法和乘法,而计算过程不会泄露原文的任何信息。计算的结果仍然是加密的,拥有密钥的用户对处理过的密文数据进…...
判断数字的奇偶[中秋快乐~]
题目描述 给定一个整数 n,编写程序判断数字 n 是奇数还是偶数,是奇数则输出 “odd”,偶数则输出 “even”。 输入格式 一行,一个整数 n。 输出格式 一行,如果 n 是奇数则输出 “odd”; 如果 nn 是偶数则输出 “even”。 样例…...
文件操作及重定向详解
1、linux下一切皆文件: 在linux中,一切皆文件是一个重要的概念,用于描述linux操作系统中所有资源和设备都以文件的形式进行访问和处理。 这个概念可以理解为,无论是硬盘上的文件、网卡、设备、进程等,都被抽象为文件的形式存在。在linux系统中,通…...
鸿蒙next json解析 ArkUI 带你玩转 arkts json解析
前言导读 相信很多同学再开发过程中都会遇到json解析的处理,不管是跟服务端交互 或者是读取本地的json 都会遇到json解析 那么正好今天有空正好讲一下鸿蒙next里面的json解析 JSON解析与生成 本模块提供了将JSON文本转换为JSON对应对象或值,以及将对象…...
东土科技加码芯片业务投资,携手神经元共建新型工业生态
为抢抓国产化芯片发展的重大机遇,东土科技决定进一步加大对神经元信息技术(成都)有限公司的投资。这一战略布局有利于东土科技鸿道Intewell工业操作系统与神经元公司芯片的深度协同,推动实现“信息技术、网络技术、控制技术、数字…...
指纹与指甲检测系统源码分享
指纹与指甲检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer V…...
C++3D迷宫
目录 开头程序程序的流程图程序游玩的效果下一篇博客要说的东西 开头 大家好,我叫这是我58。 程序 #include <iostream> using namespace std; void printmaze(char strmaze[5][5][5]) {cout << "-----" << endl;int i 0;int ia 0…...
跨界融合,GIS如何赋能游戏商业——以《黑神话:悟空》为例
在数字化时代,地理信息系统(GIS)技术正以其独特的空间分析和可视化能力,为游戏产业带来革命性的变革。《黑神话:悟空》作为中国首款3A级别的动作角色扮演游戏,不仅在游戏设计和技术上取得了突破,…...
【计网】从零开始使用TCP进行socket编程 --- 客户端与服务端的通信实现
阵雨后放晴的天空中, 出现的彩虹很快便会消失。 而人心中的彩虹却永不会消失。 --- 太宰治 《斜阳》--- 从零开始使用TCP进行socket编程 1 TCP与UDP2 TCP服务器类2.1 TCP基础知识2.2 整体框架设计2.3 初始化接口2.4 循环接收接口与服务接口 3 服务端与客户端测试…...
Imagen:重塑图像生成领域的革命性突破
目录 引言 一、Imagen模型的技术原理 1. 模型概述 2. 工作流程 3. 技术创新 二、Imagen模型的应用实例 1. 创意设计 2. 虚拟角色制作 3. 概念可视化 三、Imagen模型的优势与挑战 1. 优势 2. 挑战 四、Imagen模型的未来发展方向 1. 图像生成质量的提升 2. 多模态…...
Golang | Leetcode Golang题解之第402题移掉K位数字
题目: 题解: func removeKdigits(num string, k int) string {stack : []byte{}for i : range num {digit : num[i]for k > 0 && len(stack) > 0 && digit < stack[len(stack)-1] {stack stack[:len(stack)-1]k--}stack app…...
c++ gtsam/inference/Symbol.h 详细介绍
gtsam/inference/Symbol.h 是 GTSAM 库中的一个头文件,定义了 Symbol 类。这个类用于在因子图优化中标识和管理变量。Symbol 提供了一种便捷的方式来创建和使用唯一标识符,从而避免手动管理复杂的整数键。 Symbol 类详细介绍 Symbol 类是 GTSAM 中用于…...
apache文件共享和访问控制
实现apache文件共享 文件共享路径 <Directory "/var/www/html"> #默认发布路径,功能限制 Options Indexes FollowSymLinks #indexes支持文件共享功能 AllowOverride None Require all granted </Directory> 进入到该路径下 cd…...
LeetCode 2398.预算内的最多机器人数目:滑动窗口+单调队列——思路清晰的一篇题解
【LetMeFly】2398.预算内的最多机器人数目:滑动窗口单调队列——思路清晰的一篇题解 力扣题目链接:https://leetcode.cn/problems/maximum-number-of-robots-within-budget/ 你有 n 个机器人,给你两个下标从 0 开始的整数数组 chargeTimes …...
vue 在线预览word和excel
yarn add vue-office/excel vue-office/docx <template><div><vue-office-docx:src"docx"style"height: 100%; margin: 0; padding: 0"rendered"rendered"/></div> </template><script> //引入VueOfficeDoc…...
物联网智能项目
物联网智能项目是一个涉及多个领域和技术的综合性项目,旨在通过互联网将各种物理设备连接起来,实现数据的采集、传输、处理和分析,进而实现智能化控制和管理。以下是对物联网智能项目的详细阐述,包括其定义、关键技术、应用领域、…...
828华为云征文|Flexus云服务器X:Python安装的极致便捷之旅
目录 前言 一、Flexus云服务器X介绍 1.1 Flexus云服务器X实例简介 1.2 Flexus云服务器X实例特点 1.3 Flexus云服务器X实例场景需求 二、Flexus云服务器X购买 2.1 Flexus X实例购买 2.2 重置密码 2.3 登录服务器 三、Flexus云服务器X安装Python 3.1 Python下载 3.2 Python安装 3…...
Midjourney中秋特典-12张图附魔咒
第一张 魔咒 A Mid-Autumn Festival poster, a round bright moon, a Chinese-style pavilion with a scene of a reunion from Dream of the Red Chamber, a new Chinese style --ar 3:4 --v 6.1第二张 魔咒 The bright full moon hung in the night sky,clear in outline a…...
编写程序,从键盘输入若干整数,将其保存入一个数组中。利用Arravs进行排序,然后查找出第3大的整数
编写程序,从键盘输入若干整数,将其保存入一个数组中。利用Arravs进行排序,然 后查找出第3大的整数 import java.util.ArrayList; import java.util.Arrays; import java.util.Scanner;public class helloworld {public static void main(Stri…...
Vim 调用外部命令学习笔记
Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...
conda相比python好处
Conda 作为 Python 的环境和包管理工具,相比原生 Python 生态(如 pip 虚拟环境)有许多独特优势,尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处: 一、一站式环境管理:…...
反向工程与模型迁移:打造未来商品详情API的可持续创新体系
在电商行业蓬勃发展的当下,商品详情API作为连接电商平台与开发者、商家及用户的关键纽带,其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息(如名称、价格、库存等)的获取与展示,已难以满足市场对个性化、智能…...
VB.net复制Ntag213卡写入UID
本示例使用的发卡器:https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...
R语言AI模型部署方案:精准离线运行详解
R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...
【入坑系列】TiDB 强制索引在不同库下不生效问题
文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...
服务器--宝塔命令
一、宝塔面板安装命令 ⚠️ 必须使用 root 用户 或 sudo 权限执行! sudo su - 1. CentOS 系统: yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh2. Ubuntu / Debian 系统…...
如何更改默认 Crontab 编辑器 ?
在 Linux 领域中,crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用,用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益,允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...
Webpack性能优化:构建速度与体积优化策略
一、构建速度优化 1、升级Webpack和Node.js 优化效果:Webpack 4比Webpack 3构建时间降低60%-98%。原因: V8引擎优化(for of替代forEach、Map/Set替代Object)。默认使用更快的md4哈希算法。AST直接从Loa…...
给网站添加live2d看板娘
给网站添加live2d看板娘 参考文献: stevenjoezhang/live2d-widget: 把萌萌哒的看板娘抱回家 (ノ≧∇≦)ノ | Live2D widget for web platformEikanya/Live2d-model: Live2d model collectionzenghongtu/live2d-model-assets 前言 网站环境如下,文章也主…...
