#winapi

winsafe

在安全的、符合Rust语法的Rust中实现Windows API和GUI

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

Download history 29121/week @ 2024-05-04 31476/week @ 2024-05-11 31697/week @ 2024-05-18 30691/week @ 2024-05-25 34849/week @ 2024-06-01 35840/week @ 2024-06-08 36211/week @ 2024-06-15 34083/week @ 2024-06-22 31659/week @ 2024-06-29 43538/week @ 2024-07-06 48206/week @ 2024-07-13 54812/week @ 2024-07-20 58176/week @ 2024-07-27 57433/week @ 2024-08-03 62086/week @ 2024-08-10 59027/week @ 2024-08-17

245,891 个月下载量
用于 442 个crate(6 个直接使用)

MIT 许可证

3MB
66K SLoC

WinSafe

Crates.io Crates.io total downloads License: MIT Lines of code

在安全的、符合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覆盖,请查看winapiwindowscrate,它们是不安全的,但拥有所有内容。

实现了高级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 允许您以两种方式创建窗口:

以下 示例 通过编程创建了一个包含按钮的窗口。注意如何使用闭包处理点击事件

Example 01

[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

无运行时依赖

功能