## Rust for Windows The [windows](https://crates.io/crates/windows) and [windows-sys](https://crates.io/crates/windows-sys) crates let you call any Windows API past, present, and future using code generated on the fly directly from the [metadata describing the API](https://github.com/microsoft/windows-rs/tree/master/crates/libs/bindgen/default) and right into your Rust package where you can call them as if they were just another Rust module. The Rust language projection follows in the tradition established by [C++/WinRT](https://github.com/microsoft/cppwinrt) of building language projections for Windows using standard languages and compilers, providing a natural and idiomatic way for Rust developers to call Windows APIs. * [Getting started](https://kennykerr.ca/rust-getting-started/) * [Samples](https://github.com/microsoft/windows-rs/tree/master/crates/samples) * [Releases](https://github.com/microsoft/windows-rs/releases) * [Feature search](https://microsoft.github.io/windows-rs/features) Start by adding the following to your Cargo.toml file: ```toml [dependencies.windows] version = ">=0.59, <=0.62" features = [ "Data_Xml_Dom", "Win32_Security", "Win32_System_Threading", "Win32_UI_WindowsAndMessaging", ] ``` Using a range instead of the [default Caret requirements](https://doc.rust-lang.org/cargo/reference/specifying-dependencies.html#caret-requirements) helps avoid duplicate versions in downstream graphs and improves resolver flexibility. Make use of any Windows APIs as needed: ```rust,no_run use windows::{ core::*, Data::Xml::Dom::*, Win32::Foundation::*, Win32::System::Threading::*, Win32::UI::WindowsAndMessaging::*, }; fn main() -> Result<()> { let doc = XmlDocument::new()?; doc.LoadXml(h!("hello world"))?; 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(()) } ```