[windows-rs]Rust 调用 Windows API

0、文档

板条箱windows入门0.48.0版本示例代码
板条箱windows的文档
板条箱windows的Github仓库发行页面

1、VSCode编辑器

下载安装VSCode
安装VSCode扩展

  1. rust-analyzerrust-analyzer(CN)(新手应该在rust-analyzer运行完毕后再动键盘)
  2. crates
  3. Better TOML 或者 Even Better TOML

2、安装Microsoft C++ 生成工具

访问微软官网下载生成工具,勾选使用 C++ 的桌面开发之后会自动勾选5个项目
取消勾选以下项目
用于 Windows 的 C++ CMake 工具
测试工具核心功能 - 生成工具
C++ AddressSanitizer
只保留以下两个(SDK版本不用管,Win10或Win11都行,勾什么就留什么,不用自己勾)
MSVC v143 - VS 2022 C++ x64/x86 生成工具
Windows 11 SDK (10.0.22000.0)

3、安装rust

安装前必须重启电脑
访问Rust官网下载并安装Rust

4、设置rust镜像

运行where rustc找到.cargo文件夹
.cargo文件夹下新建无后缀文件,文件名为config,并输入以下内容,保存

[source.crates-io]
registry = "https://github.com/rust-lang/crates.io-index"
replace-with = 'ustc'
[source.ustc]
registry = "git://mirrors.ustc.edu.cn/crates.io-index"

5、创建项目

cargo new message-box
cd .\message-box\
cargo add windows
code .

6、获取windows-rs在电脑中的位置

  1. 查看文件.\message-box\Cargo.toml,记录当前依赖为windows = "0.48.0"且无特性features(后续依赖需要修改)
    [package]
    name = "message-box"
    version = "0.1.0"
    edition = "2021"
    
    # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
    
    [dependencies]
    windows = "0.48.0"
    
  2. 编辑文件.\message-box\src\main.rs
    在代码开头插入use语句
    use windows;
    
    这时出现存在warningwarning: unused import: `windows` ,不用管,本来也不用,一会就删了重写
  3. 按住Ctrl,左键单击windows跳转到文件
    请添加图片描述
    右键lib.rs文件,找到该文件在电脑中的位置
    请添加图片描述
  4. 删除添加的use语句
  5. 已获取lib.rs的路径:.\.cargo\registry\src\mirrors.ustc.edu.cn-61ef6e0cd06fb9b8\windows-0.48.0\src\lib.rs
    记录父文件夹:.\.cargo\registry\src\mirrors.ustc.edu.cn-61ef6e0cd06fb9b8\windows-0.48.0
    该文件夹为windows-rs在电脑中的位置

7、查找MessageBoxW特性

打开一个带有搜索文件内容功能的软件,例如ndd
目标目录:.\.cargo\registry\src\mirrors.ustc.edu.cn-61ef6e0cd06fb9b8\windows-0.48.0
查找目标:MessageBoxW
点击全部查找(把它肠子翻烂,比看demo简单多了,官方demo是大杂烩,根本不知道引用的哪里)
在这里插入图片描述

处理搜索结果

  1. readme.md:无法确认使用了什么特性,跳过。
  2. Web/InternetExplorer/impl.rs
    关键字:fn MessageBoxW
    未提到特性,跳过。
  3. Web/InternetExplorer/mod.rs
    关键字:pub unsafe fn MessageBoxW
    特性:#[doc = "*Required features: `\"Win32_Foundation\"`*"]
    这个分类应该对应IE - 微软文档
  4. UI/WindowsAndMessaging/mod.rs
    关键字:pub unsafe fn MessageBoxW
    特性:#[doc = "*Required features: `\"Win32_UI_WindowsAndMessaging\"`, `\"Win32_Foundation\"`*"]
    查看该文件,很多常量与winuser.h有关
    找到了MessageBoxW,特性为Win32_UI_WindowsAndMessagingWin32_Foundation
  5. UI/Shell/mod.rs
    关键字:pub unsafe fn ShellMessageBoxW
    名字都对不上,跳过。
  6. Grapics/Printing/mod.rs
    关键字:pub unsafe fn PrinterMessageBoxW
    名字都对不上,跳过。

MessageBoxW特性
找到了MessageBoxW,特性为Win32_UI_WindowsAndMessagingWin32_Foundation

8、修改Cargo.toml

修改文件.\message-box\Cargo.toml

[package]
name = "message-box"
version = "0.1.0"
edition = "2021"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies.windows]
version = "0.48.0"
features = [
    "Win32_UI_WindowsAndMessaging",
    "Win32_Foundation",
]

运行cargo run,输出了Hello, world!

9、编写代码

编辑文件.\message-box\src\main.rs
整段代码手打,全程代码提示,打的最多的就是双冒号。
参考文档:MessageBoxW 函数 (winuser.h) - 微软文档

#![windows_subsystem = "windows"]

use windows::w;
use windows::Win32::UI::WindowsAndMessaging::{MessageBoxW, MB_ICONINFORMATION, MB_OK};

fn main() {
    println!("Hello, world!");
    unsafe {
        MessageBoxW(None, w!("Hello"), w!("World"), MB_ICONINFORMATION | MB_OK);
    }
}

运行cargo run,显示对话框
在这里插入图片描述
至此,用Rust(exe160,256字节)实现了vbs(转exe31,232字节)一句话就完成的程序

MsgBox "Hello", vbInformation + vbOKOnly, "World"

10、发布

cargo build --release
exe文件:.\message-box\target\release\message-box.exe



请添加图片描述

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
使用 GTK-rs 库需要先安装 GTK+3,可以在 Linux 系统下通过包管理器安装,也可以在 Windows 和 macOS 下从官网下载安装程序进行安装。 安装 GTK+3 后,可以在 Rust 项目中添加 gtk 和 gdk 两个依赖: ```toml [dependencies] gtk = "0.9" gdk = "0.9" ``` 然后在 Rust 代码中引入 gtk 和 gdk 库: ```rust extern crate gtk; extern crate gdk; ``` 在 GTK-rs 中,主要有两种方式创建 GUI 窗口:Builder 和手动创建。下面分别介绍这两种方式。 ### 使用 Builder 创建 GUI 窗口 使用 Builder 可以通过 XML 文件描述 GUI 界面,然后使用 Rust 代码加载并显示窗口。以下是一个简单的例子: ```xml <?xml version="1.0" encoding="UTF-8"?> <interface> <object class="GtkWindow" id="main_window"> <property name="title">Hello, World!</property> <property name="default-width">400</property> <property name="default-height">300</property> <child> <object class="GtkLabel" id="label"> <property name="label">Hello, World!</property> </object> </child> </object> </interface> ``` 在 Rust 代码中,可以使用 gtk::Builder 加载并显示窗口: ```rust use gtk::prelude::*; use gtk::{Builder, Window}; fn main() { if let Err(err) = gtk::init() { eprintln!("Failed to initialize GTK: {}", err); return; } let glade_src = include_str!("path/to/glade/file.glade"); let builder = Builder::from_string(glade_src); let window: Window = builder.get_object("main_window").unwrap(); window.show_all(); gtk::main(); } ``` ### 手动创建 GUI 窗口 手动创建 GUI 窗口需要在 Rust 代码中定义窗口和窗口中的组件,以下是一个简单的例子: ```rust use gtk::prelude::*; use gtk::{Window, WindowType, Label}; fn main() { if let Err(err) = gtk::init() { eprintln!("Failed to initialize GTK: {}", err); return; } let window = Window::new(WindowType::Toplevel); window.set_title("Hello, World!"); window.set_default_size(400, 300); let label = Label::new(Some("Hello, World!")); window.add(&label); window.show_all(); gtk::main(); } ``` 以上代码中,创建了一个顶层窗口和一个标签组件,将标签添加到窗口中并显示窗口。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值