You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rust使用windows crate调用CreateWindowExW创建窗口失败求助

问题定位与修复

你的代码出现0x80070057(参数错误)的核心原因是CreateWindowExW的参数类型不匹配,同时还有几处需要修正的细节:

核心错误点:CreateWindowExW参数类型不匹配

CreateWindowExW的第8、9个参数类型是HWND和HMENU,并非Option类型。你传入的None会被解析为无效值,直接触发参数错误,需要替换为HWND(0)和HMENU(0)来表示空句柄。

其他需要修正的细节

  • 未导入窗口消息常量:WM_CLOSE和WM_DESTROY属于windows::Win32::UI::WindowsAndMessaging下的常量,必须显式导入才能使用,否则会导致编译错误。
  • 窗口背景画刷硬编码:直接使用HBRUSH(2)是硬编码方式,建议使用官方定义的COLOR_WINDOW常量,增强代码可读性和兼容性。
  • WM_CLOSE冗余处理:WM_CLOSE的默认窗口过程会自动调用DestroyWindow,手动调用属于冗余操作,可能导致逻辑重复。

修正后的完整代码

use std::ptr;

use windows::{
    core::{w, PCWSTR},
    Win32::{
        Foundation::{GetLastError, HINSTANCE, HWND, LPARAM, LRESULT, WPARAM},
        Graphics::Gdi::HBRUSH,
        System::LibraryLoader::GetModuleHandleW,
        UI::WindowsAndMessaging::{
            CreateWindowExW, DefWindowProcW, PostQuitMessage, RegisterClassW,
            CS_HREDRAW, CS_VREDRAW, CW_USEDEFAULT, HCURSOR, HICON, WINDOW_EX_STYLE, WNDCLASSW,
            WS_OVERLAPPEDWINDOW, WM_CLOSE, WM_DESTROY, COLOR_WINDOW, HMENU,
        },
    },
};

fn main() {
    match create_window() {
        Ok(_) => {},
        Err(e) => eprintln!("{}", e),
    };
}

pub fn create_window() -> Result<(), Box<dyn std::error::Error>> {
    let h_instance: HINSTANCE = unsafe { GetModuleHandleW(None) }?.into();
    let lp_sz_class_name = w!("window_class");
    let lp_sz_window_name = w!("window_title");

    let window_class = WNDCLASSW {
        style: CS_HREDRAW | CS_VREDRAW,
        lpfnWndProc: Some(window_proc),
        cbClsExtra: 0,
        cbWndExtra: 0,
        hInstance: h_instance,
        hIcon: HICON(0),
        hCursor: HCURSOR(0),
        // 使用官方常量替换硬编码
        hbrBackground: HBRUSH((COLOR_WINDOW + 1) as isize),
        lpszMenuName: PCWSTR(ptr::null_mut()),
        lpszClassName: lp_sz_class_name,
    };

    if unsafe { RegisterClassW(&window_class) } == 0 {
        unsafe { GetLastError() }?;
    };

    let hwnd = unsafe {
        CreateWindowExW(
            WINDOW_EX_STYLE(0),
            window_class.lpszClassName,
            lp_sz_window_name,
            WS_OVERLAPPEDWINDOW,
            CW_USEDEFAULT,
            CW_USEDEFAULT,
            CW_USEDEFAULT,
            CW_USEDEFAULT,
            // 替换None为HWND(0)表示空父窗口
            HWND(0),
            // 替换None为HMENU(0)表示空菜单
            HMENU(0),
            window_class.hInstance,
            None,
        )
    };

    if hwnd == HWND(0) {
        unsafe { GetLastError() }?;
    }

    Ok(())
}

unsafe extern "system" fn window_proc(
    hwnd: HWND,
    msg: u32,
    wparam: WPARAM,
    lparam: LPARAM,
) -> LRESULT {
    match msg {
        WM_CLOSE => {
            // 移除冗余的DestroyWindow调用,交由默认过程处理
            unsafe { DefWindowProcW(hwnd, msg, wparam, lparam) }
        }
        WM_DESTROY => {
            unsafe { PostQuitMessage(0) };
            LRESULT(0)
        }
        _ => unsafe { DefWindowProcW(hwnd, msg, wparam, lparam) },
    }
}

内容的提问来源于stack exchange,提问作者fluffy-soft-dev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 13:22:14