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…...
【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型
摘要 拍照搜题系统采用“三层管道(多模态 OCR → 语义检索 → 答案渲染)、两级检索(倒排 BM25 向量 HNSW)并以大语言模型兜底”的整体框架: 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后,分别用…...
云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?
大家好,欢迎来到《云原生核心技术》系列的第七篇! 在上一篇,我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在,我们就像一个拥有了一块崭新数字土地的农场主,是时…...
AI Agent与Agentic AI:原理、应用、挑战与未来展望
文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例:使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例:使用OpenAI GPT-3进…...
ServerTrust 并非唯一
NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...
使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台
🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...
基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解
JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用,结合SQLite数据库实现联系人管理功能,并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能,同时可以最小化到系统…...
论文笔记——相干体技术在裂缝预测中的应用研究
目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术:基于互相关的相干体技术(Correlation)第二代相干体技术:基于相似的相干体技术(Semblance)基于多道相似的相干体…...
使用Spring AI和MCP协议构建图片搜索服务
目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式(本地调用) SSE模式(远程调用) 4. 注册工具提…...
Java求职者面试指南:计算机基础与源码原理深度解析
Java求职者面试指南:计算机基础与源码原理深度解析 第一轮提问:基础概念问题 1. 请解释什么是进程和线程的区别? 面试官:进程是程序的一次执行过程,是系统进行资源分配和调度的基本单位;而线程是进程中的…...
【Linux】Linux 系统默认的目录及作用说明
博主介绍:✌全网粉丝23W,CSDN博客专家、Java领域优质创作者,掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围:SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...
