22个版本
0.0.22 | 2024年8月1日 |
---|---|
0.0.21 | 2024年6月1日 |
0.0.20 | 2024年3月1日 |
0.0.18 | 2023年10月1日 |
0.0.1 | 2019年10月28日 |
#9 in Windows APIs
245,891 个月下载量
用于 442 个crate(6 个直接使用)
3MB
66K SLoC
WinSafe
在安全的、符合Rust语法的Rust中实现Windows API和GUI。
WinSafe有
- 低级Win32 API常量、函数和结构体;
- 高级结构体,用于构建本机Win32 GUI应用程序。
WinSafe文档
分支 | 文档 |
---|---|
稳定 | docs.rs/winsafe |
夜间(master) | rodrigocfd.github.io/winsafe/winsafe |
当前状态
实现了本机FFI项目
本机FFI项目 | 数量 |
---|---|
函数 | 783 |
结构体 | 237 |
常量 | 13,417 |
窗口消息 | 655 |
句柄 | 45 |
COM接口 | 90 |
COM方法 | 541 |
尽管WinSafe已经有了很多Win32 API,但它并没有所有,仅仅是因为Win32 API非常庞大。所以如果你在寻找全面的Win32覆盖,请查看winapi或windowscrate,它们是不安全的,但拥有所有内容。
实现了高级GUI控件
- 用户自定义窗口/对话框 – 主要、模态、非模态、控件、仅消息。
- 本机控件 – 按钮、复选框、组合框、日期和时间选择器、编辑、标题栏、标签、列表框、列表视图、月历、进度条、单选按钮、状态栏、选项卡、滑块、树视图、上下。
用法
在你的 Cargo.toml
中添加依赖项
[dependencies]
winsafe = { version = "0.0.22", features = [] }
你也可以直接使用夜间(master)分支 直接,以立即获取最新功能
[dependencies]
winsafe = { git = "https://github.com/rodrigocfd/winsafe", features = [] }
然后你必须启用你想要包含的 Cargo功能 – 这些模块的命名大多以本机Windows DLL和库的名称命名。
Cargo功能
WinSafe中的API被拆分为Cargo功能以加快编译时间。只有你包含的功能才会被编译。
目前可用的以下Cargo功能
功能 | 描述 |
---|---|
advapi |
Advapi32.dll和Ktmw32.dll,高级内核功能 |
comctl |
ComCtl32.dll,通用控件 |
dshow |
DirectShow |
dwm |
桌面窗口管理器 |
dxgi |
DirectX图形基础设施 |
gdi |
Gdi32.dll,Windows GDI |
gui |
WinSafe高级GUI抽象 |
kernel |
Kernel32.dll,基本内核功能 |
mf |
媒体基金会 |
ole |
基本 OLE/COM 支持 |
oleaut |
OLE 自动化 |
raw-dylib |
启用 raw-dylib 链接 |
shell |
Shell32.dll、Shlwapi.dll 和 Userenv.dll,基于 COM 的 Windows Shell |
taskschd |
任务计划程序 |
用户 |
User32.dll 和 ComDlg32.dll,基本的 Windows GUI 支持 |
uxtheme |
UxTheme.dll,扩展窗口主题 |
版本 |
Version.dll,用于操作 *.exe 版本信息 |
无需担心包含依赖功能。一旦您使用了一个功能,Cargo 会自动添加和解决所有依赖。
示例
注意:您可以在专门的仓库中找到几个示例:github.com/rodrigocfd/winsafe-examples
WinSafe 允许您以两种方式创建窗口:
- 通过编程定义参数;或者
- 从使用 WYSIWYG 资源编辑器创建的
.res
文件中加载对话框。
以下 示例 通过编程创建了一个包含按钮的窗口。注意如何使用闭包处理点击事件
[dependencies]
winsafe = { version = "0.0.22", features = ["gui"] }
#![windows_subsystem = "windows"]
use winsafe::{self as w, prelude::*, gui};
fn main() {
let my = MyWindow::new(); // instantiate our main window
if let Err(e) = my.wnd.run_main(None) { // ... and run it
eprintln!("{}", e);
}
}
#[derive(Clone)]
pub struct MyWindow {
wnd: gui::WindowMain, // responsible for managing the window
btn_hello: gui::Button, // a button
}
impl MyWindow {
pub fn new() -> Self {
let wnd = gui::WindowMain::new( // instantiate the window manager
gui::WindowMainOpts {
title: "My window title".to_owned(),
size: (300, 150),
..Default::default() // leave all other options as default
},
);
let btn_hello = gui::Button::new(
&wnd, // the window manager is the parent of our button
gui::ButtonOpts {
text: "&Click me".to_owned(),
position: (20, 20),
..Default::default()
},
);
let new_self = Self { wnd, btn_hello };
new_self.events(); // attach our events
new_self
}
fn events(&self) {
let wnd = self.wnd.clone(); // clone so it can be passed into the closure
self.btn_hello.on().bn_clicked(move || {
wnd.hwnd().SetWindowText("Hello, world!")?; // call native Windows API
Ok(())
});
}
}
许可协议
根据 MIT 许可协议 许可,有关详细信息,请参阅 LICENSE.md