Rust是何用一種系統級編程語(yǔ)言,它注重安全、編寫(xiě)并發(fā)和性能,生程在本??文中,何用我們將學(xué)習如何用R??ust編寫(xiě)Windows原生程序,編寫(xiě)Windows原生程序是生程指直接編譯為Windows操作系統可執行文件的程序,這些程序通常使用WinAPI(Windows應用程序編程接口)進(jìn)行開(kāi)發(fā)。何用
我ヽ(′▽?zhuān)?/們需要在計算機上安裝Rust,編寫(xiě)請訪(fǎng)問(wèn)https://www.rust-lang.org/tools/install 獲取安裝說(shuō)明。生程
1、打開(kāi)命令提示符或終端,編寫(xiě)運行以下命令以創(chuàng )建一個(gè)新┐(′ー`)┌的生程Rust項目:
c??ヽ(′?`)ノargo new windows_app --bin
這將??在當前目錄下創(chuàng )建一個(gè)名為windows_app的新文件夾( ?° ?? ?°),其中包含一個(gè)用于構建W??indows原生程序的何用Cargo.toml??文件。
2、???編寫(xiě)進(jìn)入新創(chuàng )建的生程項目目錄:
cd windows_ap(′?`)p1、在src/main.(/ω\)rs文件中,添加以下代碼ヽ(′▽?zhuān)?ノ以初始化(hua)Windows API:
extern crate winapi; // 引入??winapi庫use winapi::shared::minwindef::{ DWORD,(???) LPCSTR}; // 引入所需的WinAPI類(lèi)型us( ?ヮ?)e winapi::um::winuser::{ CreateWindowExW, Get(╬?益?)MessageW, MSG}; // 引入所需WinAPI函數use winapi::um::winuser:??:Regiヽ(′▽?zhuān)?ノsterClassExW; // 引入RegisterClassExW函數use std::ffi::CString; // 引入CString類(lèi)型use std::ptr; // 引入ptr類(lèi)型use std::sync::mp??sc::{ channel, Sender??}; //ヾ(?■_■)ノ 引入channヽ(′▽?zhuān)?ノel和Sende(′ω`)r類(lèi)型use st┐(′?`)┌d::thread; // 引入thread類(lèi)型use winapi::um::winuser::WNDCLASSEXW; // 引入WNDCLASSEXW結構體use winapi::um::winuser::WNDCLASSEX??W::*; // 引入WNDCLASSEXW結構體的字段use winapi::um::winuser::WNDPROC; // 引入WNDPROC類(lèi)型use winapi::um::winuse(′▽?zhuān)?)r::LRESULT; // 引入LRESULT類(lèi)型use winapi::um::winuser::HINSTANCE; // 引入HINSTANCE類(lèi)型use winapi::um::winuse(′▽?zhuān)?r::HWND; // 引入HWND類(lèi)型use winapi::um::winuser::HDC; // 引入HDC類(lèi)型use winapi::um::winuser::PAINTSTRUCT; // 引入PAINTSTRUCT類(lèi)型use winapi::um(′?_?`)::winuser::GetDC; // 引入GetDC函數use win(′?`*)a??pi::um::winuser::ReleaseDC; // 引入ReleaseDC函數use winapi::um::winuser::BeginPaint; // 引入BeginPaint函數use winapi::um::win??user::EndPaint; // 引入EndPaint函數use winapi::um:┐(′д`)┌:winuser::InvalidateRect; // 引入InvalidateRect函數use winapi::um::winus??er::( ?ヮ?)GetMessageW as GetMessage; // 引入GetMessageW函數作為別名GetMessageuse winapi::um::winuser::Translat(◎_◎;)eMessage; // 引入Transla(′▽?zhuān)?teMessage函數use winapi::um::winuser::DispatchMessageW; // 引入DispatchMessageW函數??us??e?? winapi::u(/ω\)m::winuser::DefWindowP??rocW as DefWindowProc; // 引入DefWindowProcW函數作為別名DefWindowProcuse winapi::um::winuser::SetTimer; // 引入SetTimer函數use winapi::um::winuser::Kill(?_?;)Timer; // 引入KillTimer函數use winapi::um::winuser::SetCursorPos; // 引入SetCursorPos函數use?? winapi::um::winuser::LoadCursorA; // 引入LoadCursorA函數use winapi::um::winuser::ShowCursor; // 引入Sh??owCursor函數use wi??napi::um::winuser::Hid??eCursor; // 引入HideCursor函數use winapi::um::winuser::LoadIconA; // 引入LoadIconA函數??use winapi::um::winuser::DrawIconExW(???); // 引入DrawIconExW函數use winapi::um·winuser·SendMessageT??imeoutW as(′?`) SendMessageTimeout; // 引入SendMessageTimeoutW函數作為別名Sen??dMessageTimeoutuse winapi·system·libc·stdio as stdio; // 引入stdio庫中的printf和scanf函數作為別名printf和scanf2、在src/main.rs文件中,添加以下代碼以定義窗口類(lèi):
“`rust,unsafe
pub struct WindowClassEx: WinBaseExc<> {
wndproc: WndProcヽ(′?`)ノExt<(HWND, WPARAM, LPARAM) -> LRESULT&g( ?° ?? ?°)t;,
fn register(name: &str)
-> Self {
wndproc: DefaultWndProc,
cbSize: size_t(sizeof(classex)),
hInstance: unsafe { get_default_proc_address(get_windows_module()) as HINSTANCE },
lpfnWndProc: unbox_default(DefaultWndProc),
hbrBackground: nil,
lps??zMenuName: nil??,
hCursor: LoadCu(′?_?`)rsorA(nullptr, IDC_ARROW),
hIcon: LoadIconA(nullptr, IDI_APPLICATION),
hIconSm: Loa(′?_?`)dIconA(nullptr, ID??I_APPLICATION),
};
unsafe {
RegisterClassExW(&classex);
}
classex
}
3(′_`)、在src/main.rs文件中,添加以下代碼以實(shí)現窗口過(guò)程函數:
“`rust,unsafe
noop: Box<dyn WndProcExt<(HWND, WPAR(′?ω?`)AM, LPARAM) -> LRESULT>> = Box :: new(|hwnd, msg, wparam, lparam??| {
if msg == msg_paint then {
let (mut hdc, _) = BeginPaint(hwnd, No??ne);
let mut ps = PaintStruct();
GetClientRect(hwnd, &ps.rcPaint);
(*hdc).draw_rect(&┐(′д`)┌;ps.rcPaint);
EndPaint(′?`*)(hwヾ(′▽?zhuān)??nd, None);
} els(′?`*)e {
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&quo??t;, f32): f32;
enforce_sign_ext!("S", f64): f64;
enforce_sign_ext( ?ヮ?)!("Z", i32): i32;
enforce_sign_ext!("a&q??uot;, i32): i32;
enforc??e_sign_ext!("b", i32): i32;
enf??orce_sign_ext!("c", i32): i32;
enforce_sign_ext!("d", i32): i32;
enforce_sign_ext!(&quo??t;e", i32): i3??2;
enforce_sign_eヽ(′ー`)ノxt!("f", i32): i32;
enforce_sign_ext!("g", i32): i32;
enforce_sign_ext!("h", i32(°ロ°) !): i32;ヽ(′▽?zhuān)?ノ
enforce_sign_ext??!("i", i32): i32;
enforce_sign_ext!(&qu??ot;k", i32): i32;
e??nforce_sign_ext!("l", i32): i32;
enf?orce_sign_ext!("m", i32): i32;
enforce_sign_ext!("n", i32): i32??;
enforce_sign_ext!("o", i32): i32;
enforce_sign_ext!(&(◎_◎;)quot;p", i32): i32??;
enforce_sign_ext!("q", i32): i32;
enforce_sig??n_ext!((′ω`*)"r", i32): i32;
enforce_sign_ext!("s", i32): i3