19次发布
0.0.19 | 2024年2月11日 |
---|---|
0.0.18 | 2023年12月18日 |
#269 in 异步
308 每月下载量
145KB
2.5K SLoC
winctx
Windows上Rust的轻量级窗口上下文。
我阅读了msdn,所以你不必.
这个crate提供了一个简洁的方法来设置和运行窗口。在Windows上,窗口更像是一个通用的应用程序框架,实际上并不需要任何可见的元素,但对于在Windows上执行许多可能想要执行的生产性任务来说却是必要的。
以下是一些例子:
- 注册并使用弹出菜单的托盘图标,或者您在右下角看到的“可点击图标”。
- 发送桌面通知,或被称为“气球”的东西。
- 与剪贴板交互并监视其变化。
- 将数据复制到远程进程,允许进行非常简单的单向IPC。
因为这个crate提供了一些额外的API,因为它们也非常有用
- 基本的注册表安全访问,例如注册一个应该在用户登录时自动启动的应用程序。
这个crate是我从我的项目之间复制和粘贴的代码的组合和清理,所以它对我个人认为有用的东西有很强的意见。并非所有的事情都是可能的,但如果您缺少某些内容,并且喜欢Windows编程,请随时提出问题或发送pull request。
示例
这个crate的主要目的是
- 定义一个窗口及其功能。即它是否应该有上下文菜单或接收剪贴板事件。
- 处理窗口传入的事件。
基本循环看起来像这样
use std::pin::pin;
use tokio::signal::ctrl_c;
use winctx::{Event, CreateWindow};
const ICON: &[u8] = include_bytes!("tokio.ico");
let mut window = CreateWindow::new("se.tedro.Example")
.window_name("Example Application");
let icon = window.icons().insert_buffer(ICON, 22, 22);
let area = window.new_area().icon(icon);
let menu = area.popup_menu();
let first = menu.push_entry("Example Application").id();
menu.push_separator();
let quit = menu.push_entry("Quit").id();
menu.set_default(first);
let (sender, mut event_loop) = window
.build()
.await?;
let mut ctrl_c = pin!(ctrl_c());
let mut shutdown = false;
loop {
let event = tokio::select! {
_ = ctrl_c.as_mut(), if !shutdown => {
sender.shutdown();
shutdown = true;
continue;
}
event = event_loop.tick() => {
event?
}
};
match event {
Event::MenuItemClicked { item_id, .. } => {
println!("Menu entry clicked: {item_id:?}");
if item_id == quit {
sender.shutdown();
}
}
Event::Shutdown { .. } => {
println!("Window shut down");
break;
}
_ => {}
}
}
依赖项
~14–23MB
~302K SLoC