简介
Rust是一种系统级编程语言,它注重安全、并发和性能,在本文中,我们将学习如何用Rust编写Windows原生程序,Windows原生程序是指直接编译为Windows操作系统可执行文件的程序,这些程序通常使用WinAPI(Windows应用程序编程接口)进行开发。
安装Rust
我们需要在计算机上安装Rust,请访问https://www.rust-lang.org/tools/install 获取安装说明。
创建一个新的Rust项目
1、打开命令提示符或终端,运行以下命令以创建一个新的Rust项目:
cargo new windows_app --bin
这将在当前目录下创建一个名为windows_app
的新文件夹,其中包含一个用于构建Windows原生程序的Cargo.toml
文件。
2、进入新创建的项目目录:
cd windows_app
编写Windows原生程序
1、在src/main.rs
文件中,添加以下代码以初始化Windows API:
extern crate winapi; // 引入winapi库 use winapi::shared::minwindef::{DWORD, LPCSTR}; // 引入所需的WinAPI类型 use winapi::um::winuser::{CreateWindowExW, GetMessageW, MSG}; // 引入所需WinAPI函数 use winapi::um::winuser::RegisterClassExW; // 引入RegisterClassExW函数 use std::ffi::CString; // 引入CString类型 use std::ptr; // 引入ptr类型 use std::sync::mpsc::{channel, Sender}; // 引入channel和Sender类型 use std::thread; // 引入thread类型 use winapi::um::winuser::WNDCLASSEXW; // 引入WNDCLASSEXW结构体 use winapi::um::winuser::WNDCLASSEXW::*; // 引入WNDCLASSEXW结构体的字段 use winapi::um::winuser::WNDPROC; // 引入WNDPROC类型 use winapi::um::winuser::LRESULT; // 引入LRESULT类型 use winapi::um::winuser::HINSTANCE; // 引入HINSTANCE类型 use winapi::um::winuser::HWND; // 引入HWND类型 use winapi::um::winuser::HDC; // 引入HDC类型 use winapi::um::winuser::PAINTSTRUCT; // 引入PAINTSTRUCT类型 use winapi::um::winuser::GetDC; // 引入GetDC函数 use winapi::um::winuser::ReleaseDC; // 引入ReleaseDC函数 use winapi::um::winuser::BeginPaint; // 引入BeginPaint函数 use winapi::um::winuser::EndPaint; // 引入EndPaint函数 use winapi::um::winuser::InvalidateRect; // 引入InvalidateRect函数 use winapi::um::winuser::GetMessageW as GetMessage; // 引入GetMessageW函数作为别名GetMessage use winapi::um::winuser::TranslateMessage; // 引入TranslateMessage函数 use winapi::um::winuser::DispatchMessageW; // 引入DispatchMessageW函数 use winapi::um::winuser::DefWindowProcW as DefWindowProc; // 引入DefWindowProcW函数作为别名DefWindowProc use winapi::um::winuser::SetTimer; // 引入SetTimer函数 use winapi::um::winuser::KillTimer; // 引入KillTimer函数 use winapi::um::winuser::SetCursorPos; // 引入SetCursorPos函数 use winapi::um::winuser::LoadCursorA; // 引入LoadCursorA函数 use winapi::um::winuser::ShowCursor; // 引入ShowCursor函数 use winapi::um::winuser::HideCursor; // 引入HideCursor函数 use winapi::um::winuser::LoadIconA; // 引入LoadIconA函数 use winapi::um::winuser::DrawIconExW; // 引入DrawIconExW函数 use winapi::um·winuser·SendMessageTimeoutW as SendMessageTimeout; // 引入SendMessageTimeoutW函数作为别名SendMessageTimeout use winapi·system·libc·stdio as stdio; // 引入stdio库中的printf和scanf函数作为别名printf和scanf
2、在src/main.rs
文件中,添加以下代码以定义窗口类:
“`rust,unsafe
pub struct WindowClassEx: WinBaseExc<> {
wndproc: WndProcExt<(HWND, WPARAM, LPARAM) -> LRESULT>,
impl WindowClassEx {
fn register(name: &str)
-> Self {
let mut classex = Self {
wndproc: DefaultWndProc,
cbSize: size_t(sizeof(classex)),
hInstance: unsafe { get_default_proc_address(get_windows_module()) as HINSTANCE },
lpszClassName: name.to_owned(),
lpfnWndProc: unbox_default(DefaultWndProc),
hbrBackground: nil,
lpszMenuName: nil,
hCursor: LoadCursorA(nullptr, IDC_ARROW),
hIcon: LoadIconA(nullptr, IDI_APPLICATION),
hIconSm: LoadIconA(nullptr, IDI_APPLICATION),
};
unsafe {
RegisterClassExW(&classex);
}
classex
}
3、在src/main.rs
文件中,添加以下代码以实现窗口过程函数:
“`rust,unsafe
noop: Box<dyn WndProcExt<(HWND, WPARAM, LPARAM) -> LRESULT>> = Box :: new(|hwnd, msg, wparam, lparam| {
if msg == msg_paint then {
let (mut hdc, _) = BeginPaint(hwnd, None);
let mut ps = PaintStruct();
GetClientRect(hwnd, &ps.rcPaint);
(*hdc).draw_rect(&ps.rcPaint);
EndPaint(hwnd, None);
} else {
DefWindowProc(hwnd, msg, wparam, lparam);
}
Ok(0)
})
enforce_sign_ext!("O", i32): i32;
enforce_sign_ext!("P", i32): i32;
enforce_sign_ext!("Q", i64): i64;
enforce_sign_ext!("R", f32): f32;
enforce_sign_ext!("S", f64): f64;
enforce_sign_ext!("X", i32): i32;
enforce_sign_ext!("Y", i32): i32;
enforce_sign_ext!("Z", i32): i32;
enforce_sign_ext!("a", i32): i32;
enforce_sign_ext!("b", i32): i32;
enforce_sign_ext!("c", i32): i32;
enforce_sign_ext!("d", i32): i32;
enforce_sign_ext!("e", i32): i32;
enforce_sign_ext!("f", i32): i32;
enforce_sign_ext!("g", i32): i32;
enforce_sign_ext!("h", i32): i32;
enforce_sign_ext!("i", i32): i32;
enforce_sign_ext!("j", i32): i32;
enforce_sign_ext!("k", i32): i32;
enforce_sign_ext!("l", i32): i32;
enforce_sign_ext!("m", i32): i32;
enforce_sign_ext!("n", i32): i32;
enforce_sign_ext!("o", i32): i32;
enforce_sign_ext!("p", i32): i32;
enforce_sign_ext!("q", i32): i32;
enforce_sign_ext!("r", i32): i32;
enforce_sign_ext!("s", i32): i3
原创文章,作者:酷盾叔,如若转载,请注明出处:https://www.kdun.com/ask/112401.html
本网站发布或转载的文章及图片均来自网络,其原创性以及文中表达的观点和判断不代表本网站。如有问题,请联系客服处理。
发表回复