14次重大发布

0.59.0 2024年7月30日
0.52.0 2023年11月15日
0.48.0 2023年3月31日
0.42.0 2022年9月27日
0.28.0 2021年11月17日

#8 in Windows API

Download history 2188443/week @ 2024-05-04 2356656/week @ 2024-05-11 2318365/week @ 2024-05-18 2287450/week @ 2024-05-25 2561532/week @ 2024-06-01 2446727/week @ 2024-06-08 2443659/week @ 2024-06-15 2502943/week @ 2024-06-22 2395205/week @ 2024-06-29 2676240/week @ 2024-07-06 2697159/week @ 2024-07-13 2810648/week @ 2024-07-20 2718112/week @ 2024-07-27 2877003/week @ 2024-08-03 3230514/week @ 2024-08-10 2894221/week @ 2024-08-17

12,201,931 每月下载量
用于 53,429 个crate(417个直接使用)

MIT/Apache

17MB
287K SLoC

Rust for Windows

通过直接从描述API的元数据生成代码,并在你的Rust包中调用它们,就像调用另一个Rust模块一样,windowswindows-sys crate允许你调用过去、现在和未来的任何Windows API。Rust语言投影遵循由 C++/WinRT 建立的传统,使用标准语言和编译器为Windows构建语言投影,为Rust开发者提供调用Windows API的自然和习惯性方式。

首先在Cargo.toml文件中添加以下内容

[dependencies.windows]
version = "0.58"
features = [
    "Data_Xml_Dom",
    "Win32_Security",
    "Win32_System_Threading",
    "Win32_UI_WindowsAndMessaging",
]

根据需要使用任何Windows API

use windows::{
    core::*, Data::Xml::Dom::*, Win32::Foundation::*, Win32::System::Threading::*,
    Win32::UI::WindowsAndMessaging::*,
};

fn main() -> Result<()> {
    let doc = XmlDocument::new()?;
    doc.LoadXml(h!("<html>hello world</html>"))?;

    let root = doc.DocumentElement()?;
    assert!(root.NodeName()? == "html");
    assert!(root.InnerText()? == "hello world");

    unsafe {
        let event = CreateEventW(None, true, false, None)?;
        SetEvent(event)?;
        WaitForSingleObject(event, 0);
        CloseHandle(event)?;

        MessageBoxA(None, s!("Ansi"), s!("Caption"), MB_OK);
        MessageBoxW(None, w!("Wide"), w!("Caption"), MB_OK);
    }

    Ok(())
}

windows-sys

windows-sys crate是针对最具挑战性情况的无开销后备方案,主要在绝对最佳编译时间至关重要的场合使用。它只包括函数声明(externs)、结构体和常量。不提供方便的辅助工具、特性和包装器。

首先在Cargo.toml文件中添加以下内容

[dependencies.windows-sys]
version = "0.59"
features = [
    "Win32_Security",
    "Win32_System_Threading",
    "Win32_UI_WindowsAndMessaging",
]

根据需要使用任何Windows API

use windows_sys::{
    core::*, Win32::Foundation::*, Win32::System::Threading::*, Win32::UI::WindowsAndMessaging::*,
};

fn main() {
    unsafe {
        let event = CreateEventW(std::ptr::null(), 1, 0, std::ptr::null());
        SetEvent(event);
        WaitForSingleObject(event, 0);
        CloseHandle(event);

        MessageBoxA(0 as _, s!("Ansi"), s!("Caption"), MB_OK);
        MessageBoxW(0 as _, w!("Wide"), w!("Caption"), MB_OK);
    }
}

依赖项