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

使用windows-rs的SetDisplayConfig强制重检屏幕报错87,求排查

错误分析与修复方案

你的函数返回错误码87(参数错误),主要问题集中在内存初始化、参数类型和API调用格式上,以下是具体问题和修复方法:

  • Vec未正确初始化,内存未分配实际元素
    你使用Vec::with_capacity仅预留了内存空间,但Vec的长度仍为0,而QueryDisplayConfig需要的是包含对应数量DISPLAYCONFIG_PATH_INFO/DISPLAYCONFIG_MODE_INFO实例的数组。正确的做法是用默认值初始化Vec,确保内存被实际分配并初始化:

    let mut path_array = vec![Default::default(); path_count as usize];
    let mut mode_array = vec![Default::default(); mode_count as usize];
    
  • QueryDisplayConfig最后一个参数类型错误
    代码中用transmute转换空指针的方式不正确,该参数需要的是*mut DISPLAYCONFIG_TOPOLOGY_ID类型指针,直接传递null_mut()即可:

    ::core::ptr::null_mut()
    
  • SetDisplayConfig调用参数格式错误
    windows-rs中SetDisplayConfig的签名要求传递路径数量、路径数组指针、模式数量、模式数组指针,而非Some(&path_array)这类形式。正确调用方式如下:

    let result = unsafe {
        SetDisplayConfig(
            path_count,
            path_array.as_ptr(),
            mode_count,
            mode_array.as_ptr(),
            flags
        )
    };
    

修复后的完整函数

// Forces Windows to reinit display settings
pub fn force_reinit_screen() -> i32 {
    let mut path_count = 0;
    let mut mode_count = 0;
    let result = unsafe { GetDisplayConfigBufferSizes(QDC_ALL_PATHS, &mut path_count, &mut mode_count) };
    println!("GetDisplayConfigBufferSizes returned {}", result);
    
    // 正确初始化Vec,分配实际元素
    let mut path_array = vec![Default::default(); path_count as usize];
    let mut mode_array = vec![Default::default(); mode_count as usize];
    
    let result = unsafe {
        QueryDisplayConfig(
            QDC_ALL_PATHS,
            &mut path_count,
            path_array.as_mut_ptr(),
            &mut mode_count,
            mode_array.as_mut_ptr(),
            ::core::ptr::null_mut(), // 修正参数类型
        )
    };
    println!("QueryDisplayConfig returned {}", result);
    
    let flags = SDC_FORCE_MODE_ENUMERATION | SDC_APPLY | SDC_USE_SUPPLIED_DISPLAY_CONFIG | SDC_SAVE_TO_DATABASE;

    // 修正SetDisplayConfig的调用参数
    let result = unsafe {
        SetDisplayConfig(
            path_count,
            path_array.as_ptr(),
            mode_count,
            mode_array.as_ptr(),
            flags
        )
    };
    result
}

内容的提问来源于stack exchange,提问作者Aaron Dewes

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 15:30:45