新聞中心
簡介
Rust是一種系統(tǒng)級(jí)編程語言,它注重安全、并發(fā)和性能,在本文中,我們將學(xué)習(xí)如何用Rust編寫Windows原生程序,Windows原生程序是指直接編譯為Windows操作系統(tǒng)可執(zhí)行文件的程序,這些程序通常使用WinAPI(Windows應(yīng)用程序編程接口)進(jìn)行開發(fā)。

在陵水黎族等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供成都做網(wǎng)站、成都網(wǎng)站設(shè)計(jì) 網(wǎng)站設(shè)計(jì)制作按需規(guī)劃網(wǎng)站,公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),成都品牌網(wǎng)站建設(shè),全網(wǎng)營銷推廣,外貿(mào)網(wǎng)站建設(shè),陵水黎族網(wǎng)站建設(shè)費(fèi)用合理。
安裝Rust
我們需要在計(jì)算機(jī)上安裝Rust,請(qǐng)?jiān)L問https://www.rust-lang.org/tools/install 獲取安裝說明。
創(chuàng)建一個(gè)新的Rust項(xiàng)目
1、打開命令提示符或終端,運(yùn)行以下命令以創(chuàng)建一個(gè)新的Rust項(xiàng)目:
cargo new windows_app --bin
這將在當(dāng)前目錄下創(chuàng)建一個(gè)名為windows_app的新文件夾,其中包含一個(gè)用于構(gòu)建Windows原生程序的Cargo.toml文件。
2、進(jìn)入新創(chuàng)建的項(xiàng)目目錄:
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函數(shù)
use winapi::um::winuser::RegisterClassExW; // 引入RegisterClassExW函數(shù)
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結(jié)構(gòu)體
use winapi::um::winuser::WNDCLASSEXW::*; // 引入WNDCLASSEXW結(jié)構(gòu)體的字段
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函數(shù)
use winapi::um::winuser::ReleaseDC; // 引入ReleaseDC函數(shù)
use winapi::um::winuser::BeginPaint; // 引入BeginPaint函數(shù)
use winapi::um::winuser::EndPaint; // 引入EndPaint函數(shù)
use winapi::um::winuser::InvalidateRect; // 引入InvalidateRect函數(shù)
use winapi::um::winuser::GetMessageW as GetMessage; // 引入GetMessageW函數(shù)作為別名GetMessage
use winapi::um::winuser::TranslateMessage; // 引入TranslateMessage函數(shù)
use winapi::um::winuser::DispatchMessageW; // 引入DispatchMessageW函數(shù)
use winapi::um::winuser::DefWindowProcW as DefWindowProc; // 引入DefWindowProcW函數(shù)作為別名DefWindowProc
use winapi::um::winuser::SetTimer; // 引入SetTimer函數(shù)
use winapi::um::winuser::KillTimer; // 引入KillTimer函數(shù)
use winapi::um::winuser::SetCursorPos; // 引入SetCursorPos函數(shù)
use winapi::um::winuser::LoadCursorA; // 引入LoadCursorA函數(shù)
use winapi::um::winuser::ShowCursor; // 引入ShowCursor函數(shù)
use winapi::um::winuser::HideCursor; // 引入HideCursor函數(shù)
use winapi::um::winuser::LoadIconA; // 引入LoadIconA函數(shù)
use winapi::um::winuser::DrawIconExW; // 引入DrawIconExW函數(shù)
use winapi::um·winuser·SendMessageTimeoutW as SendMessageTimeout; // 引入SendMessageTimeoutW函數(shù)作為別名SendMessageTimeout
use winapi·system·libc·stdio as stdio; // 引入stdio庫中的printf和scanf函數(shù)作為別名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文件中,添加以下代碼以實(shí)現(xiàn)窗口過程函數(shù):
“`rust,unsafe
noop: Box
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
當(dāng)前文章:如何用Rust編寫windows原生程序
本文地址:http://www.dlmjj.cn/article/cocohjd.html


咨詢
建站咨詢
