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…...
Qwen3.5-2B图文对话教程:‘描述这张图’‘提取表格数据’‘生成营销文案’三类实操
Qwen3.5-2B图文对话教程:描述这张图提取表格数据生成营销文案三类实操 1. 认识Qwen3.5-2B轻量化多模态模型 Qwen3.5-2B是阿里云推出的轻量化多模态基础模型,属于Qwen3.5系列的小参数版本(20亿参数)。这个模型特别适合在资源有限…...
GBase 8c 表空间规划和对象迁移
GBase 8c 表空间规划和对象迁移 我最近看 GBase 8c 资料时,越来越强烈的一个感觉是:很多现场不是不会建表空间,而是把表空间用得太晚、太散、太随意。 真正落到现场时,最常见的现象通常不是“不会执行 CREATE TABLESPACE”&#x…...
Pikachu靶场实战:File Inclusion漏洞从入门到精通(附防御代码)
Pikachu靶场实战:File Inclusion漏洞攻防全解析 在网络安全领域,文件包含漏洞(File Inclusion)一直是Web应用渗透测试中的高频发现项。这种看似简单的漏洞类型,却能导致服务器敏感信息泄露甚至完全沦陷。Pikachu靶场作…...
SAP-PP 返工订单成本归集优化:从物料结算到成本中心的配置与增强实践
1. 售后返工订单的成本核算痛点 在制造业的售后服务环节,包材更换这类返工订单非常常见。这类订单有个特点:它们不涉及产品本身的制造过程,只是对退回产品进行简单处理。但问题来了——按照SAP-PP模块的标准配置,返工订单的成本默…...
OpenClaw多模型切换:千问3.5-9B与本地Llama混合调用
OpenClaw多模型切换:千问3.5-9B与本地Llama混合调用 1. 为什么需要多模型混合调用? 去年冬天,当我第一次尝试用OpenClaw自动生成周报时,发现一个有趣的现象:用同一个模型处理代码片段和文案内容,效果差异…...
3款高效AI答题工具助力B站硬核会员试炼
3款高效AI答题工具助力B站硬核会员试炼 【免费下载链接】bili-hardcore bilibili 硬核会员 AI 自动答题脚本,直接调用 B 站 API,非 OCR 实现 项目地址: https://gitcode.com/gh_mirrors/bi/bili-hardcore B站硬核会员试炼要求用户在100道专业题目…...
AI赋能浏览器:通过快马平台生成智能扩展,实现网页内容自动总结与代码智能解释
最近在做一个很有意思的尝试:用AI给浏览器装上"智能大脑"。具体来说,是开发一个谷歌浏览器扩展,能够智能分析网页内容。这个扩展最酷的地方在于,它能自动识别你选中的是普通文本还是代码,然后分别给出摘要总…...
SecGPT-14B提示工程:提升OpenClaw安全报告可读性的秘诀
SecGPT-14B提示工程:提升OpenClaw安全报告可读性的秘诀 1. 当安全报告遇上OpenClaw:我的真实痛点 上周五凌晨2点,我被OpenClaw的告警邮件惊醒——它发现我的个人服务器存在一个高危漏洞。但当我打开那份自动生成的安全报告时,眼…...
基于CubeMX与HAL库:STM32F302串口重定向Printf的工程化实践
1. 为什么需要串口重定向Printf 在嵌入式开发中,调试信息输出是排查问题的生命线。想象一下你正在调试一个复杂的传感器数据采集系统,突然发现数据异常,这时候如果能像在PC上编程一样直接printf("当前温度值:%f", temp…...
Phi-4-mini-reasoning保姆级教学:Windows WSL2环境部署全流程
Phi-4-mini-reasoning保姆级教学:Windows WSL2环境部署全流程 1. 模型介绍 Phi-4-mini-reasoning是微软推出的3.8B参数轻量级开源模型,专为数学推理、逻辑推导和多步解题等强逻辑任务设计。这个模型主打"小参数、强推理、长上下文、低延迟"的…...
