使用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
相关产品推荐
相关产品推荐

